2010-05-11 17 views
17

Trình duyệt có theo dõi các mã số hoạt động setIntervalsetTimeout không? Hoặc là điều này chỉ dành cho nhà phát triển để theo dõi?Trình duyệt có theo dõi các ID hẹn giờ hoạt động không?

Nếu nó theo dõi chúng, có thể truy cập thông qua BOM không?

+2

Tôi muốn nhìn thấy một câu trả lời tốt để này quá ; Tôi nghĩ đó là "không" nhưng tôi chưa bao giờ thực sự nghiên cứu nó. – Pointy

+1

Vâng, ngay cả khi nó đã bằng cách nào đó đăng ký chúng, làm thế nào bạn sẽ biết đó là gì? Vâng, tôi đoán nếu bạn biết chỉ có một thời gian chờ hoặc khoảng thời gian hoặc bất cứ điều gì, bạn sẽ không cần phải biết. – Pointy

+0

Haha, bạn đã nói "BOM" thay vì DOM. – Felix

Trả lời

4

Đó là cho các nhà phát triển để giữ theo dõi. Bạn có thể làm như vậy bằng cách sử dụng giá trị trả về của hàm setTimeout/setInterval và chuyển giá trị đó tới hàm clearTimeout/clearInterval - như được mô tả trong các câu trả lời khác ở đây.

Điều này có vẻ là do mỗi trình duyệt sẽ thực hiện theo dõi các khoảng theo cách riêng của chúng.

Từ w3.org/TR/2009/WD-html5-20090212/no.html (dự thảo, nhưng w3schools và http://w3.org/TR/Window giải thích nó gần như cùng một cách) - setTimeout và setInterval trở lại một chặng đường dài và clearTimeout/clearInterval chấp nhận một thời gian để tìm và hủy

0

Cập nhật:

Có 2 khía cạnh cho câu hỏi này.

  1. Trình duyệt có theo dõi ID hẹn giờ không?
  2. Họ có thể tiếp cận

tôi chỉ có thể đoán cho # 1 (và sau này # 2) rằng OP có nghĩa là "Họ đang theo dõi" theo nghĩa chung chung bởi vì như một nhà phát triển s/ông muốn kiểm soát họ .

Tóm lại, có chúng được theo dõi (như @s_hewitt được ghi chú là long giá trị của trình duyệt) và chúng có thể được quản lý bởi nhà phát triển bằng cách duy trì tham chiếu đến bộ tính giờ khi thiết lập.

Là một nhà phát triển bạn có thể kiểm soát (ví dụ ngừng) họ bằng cách gọi (clearInterval(handleRef), hoặc clearTimeout(handleRef))

Tuy nhiên không có mặc định window.timers hoặc bộ sưu tập tương tự cung cấp cho bạn một danh sách các tính giờ hiện - bạn sẽ cần phải duy trì bản thân nếu bạn cảm thấy cần.

function startPolling(delay){ 
    pollHandle = setInterval(doThis, delay); 
} 
function stopPolling(){ 
    clearInterval(pollHandle); 
} 

function doThisIn30minUnlessStopped(){ 
    timerHandle = setTimeout(doThisThing, 1800000); 
} 
function stop30minTimer(){ 
    clearTimeout(timerHandle); 
}  

Bạn chỉ cần tạo tham chiếu biến cho bộ hẹn giờ và nếu/khi cần, hãy xóa tên theo dõi.

Khi bạn tải một trang khác, tất cả các bộ hẹn giờ sẽ tự động bị xóa bởi trình duyệt, do đó bạn không cần duy trì xử lý và xóa chúng trừ khi bạn cần/muốn.

+2

Uhh ... Tôi có rất Nghi ngờ nghiêm trọng về điều đó ... – Pointy

+0

chắc chắn hoạt động, tôi đã sử dụng điều này trong hơn 10 năm. – scunliffe

+2

Điều này làm việc, nhưng tôi vượt qua đối tượng "clearTimeout (timerHandle)" thay vì tên của đối tượng "clearTimeout ('timerHandle')". Đã không điều tra được phương pháp ưa thích. –

1

Điều này có thể khiến bạn quan tâm, nếu bạn tò mò về cách bộ hẹn giờ được 'ghi nhớ' bằng cửa sổ của nó.

<!doctype html> 
<html lang= "en"> 
<head> 
<meta charset= "utf-8"> 
<title>Timer </title> 
</head> 
<body> 
<h1>Timers</h1> 
<script> 

if(!window.timers){ 
    var timers= [], i= 0; 
    while(i<5){ 
     timers.push(setInterval(function(){ 
      if(confirm(timers.join('\n')+'\nRemove a timer?')){ 
       clearInterval(timers.shift()); 
      } 
     }, 
     i*1000+1000)); 
     ++i; 
    } 
} 
</script> 

</body> 
</html> 
0

Nhìn vào kịch bản dưới đây, trình duyệt có thể nhớ id của mỗi setTimeout lặp

for (i = 1; i <= d; i++) { 
      (function(j) { 
       var delay = j/d; 
       t[j] = setTimeout(function() {  
         elem.style.top = j+"px"; 
        },delay); 

      })(i);   
} 

Bạn có thể truy cập chúng bằng

for (i in t) { 
     alert(t[i]); 
} 
4

Bạn có thể thêm bộ hẹn giờ toàn cầu như theo dõi bằng cách ghi đè các setTimeout/seInterval chức năng. Như một phần thưởng bạn dễ dàng thêm mã khi một bộ đếm thời gian được thiết lập hoặc popped, theo dõi giờ trực tiếp hoặc giờ popped, vv ...

Ví dụ:

timers = {}; // pending timers will be in this variable 
originalSetTimeout = window.setTimeout; 
// override `setTimeout` with a function that keeps track of all timers 
window.setTimeout = function(fu, t) { 
    var id = originalSetTimeout(function() { 
     console.log(id+" has timed out"); 
     delete timers[id]; // do not track popped timers 
     fu(); 
    }, t); 
    // track this timer in the `timers` variable 
    timers[id] = {id:id, setAt: new Date(), timeout: t}; 
    console.log(id+" has been set to pop in "+t+"ms"); 
} 
// from this point onward all uses of setTimeout will be tracked, logged to console and pending timers will be kept in the global variable "timers". 
Các vấn đề liên quan