2009-07-21 28 views
6

Tôi có bộ hẹn giờ đếm ngược mỗi giây. Nó hoạt động tuyệt vời cho đến khi người dùng mở ra 3 hoặc 4 tab của trang web của tôi, tại thời điểm đó, bộ đếm thời gian của tab mới nhất tăng gấp đôi hoặc gấp ba lần. Hiện tại tôi chỉ có thể tạo lại lỗi trong IE8. Trước đây tôi đã sử dụng setInterval và có thể tạo lại lỗi trong Firefox.Tại sao tốc độ setTimeout của tôi tăng tốc khi tôi có nhiều tab mở cho trang web của mình?

Tôi thực sự đang sử dụng FBJS (Javascript của Facebook), vì vậy tôi sẽ chỉ cung cấp một số mã giả.

function countDown() { 
    ... 
    setTimeout(function() { countDown() }, 1000);  
} 

countDown(); 

Tuy nhiên, điều tôi thực sự tìm kiếm là lý thuyết hơn. Tôi biết các trình duyệt có thể thử và chơi "bắt kịp" với setInterval, nhưng làm thế nào nhiều tab có thể gây ra hành vi này cho setTimeout?

Trả lời

5

Toàn bộ tình huống đó rất kỳ quặc. Kịch bản duy nhất có ý nghĩa khi nó có ý nghĩa là một trình duyệt đang cố gắng "làm mịn" thời gian tự phục hồi setTimeouts, giống như setInterval, và mã thực sự gây nhầm lẫn bộ hẹn giờ trong các cửa sổ khác nhau với mỗi khác.

Tôi không biết nếu đó là khả thi, đặc biệt là với Facebook có liên quan, nhưng một thử nghiệm thú vị sẽ được cung cấp cho mỗi trường hợp một tên ngẫu nhiên cho countDown chức năng và xem nếu mà làm cho bất kỳ sự khác biệt, như:

<?php $timerTag = rand(1, 1000); ?> 
function countDown<?php echo $timerTag ?>() { 
    ... 
    setTimeout(function() { countDown<? php echo $timerTag ?>() }, 1000);  
} 

countDown<?php echo $timerTag ?>(); 

Nếu điều này thay đổi hành vi quan sát được, điều đó lý luận cho kịch bản mà tôi có trong đầu. (Và có thể cung cấp một cách để giải quyết vấn đề.)

+0

Wow, cho các chức năng tên ngẫu nhiên đã làm các trick! Làm thế nào có thể javascript trong các cửa sổ khác nhau có thể ảnh hưởng lẫn nhau? – lamplighter

+1

Kỳ lạ, phải không? Tôi đoán nó phải là một cái gì đó như tôi đã nói, "làm mịn" mã một nơi nào đó trong ruột của trình duyệt xác định chức năng chỉ theo tên (tốt, có lẽ bởi trang web + tên) và không phân biệt giữa các tab khác nhau/cửa sổ. Có thể đáng giá một báo cáo lỗi ở đâu đó, thực sự. – chaos

+0

Đây có thể là giải pháp thay thế không có PHP: http://stackoverflow.com/questions/6112671/settimeout-speeds-up-with-multiple-tabs/6112864#6112864 – namuol

Các vấn đề liên quan