2010-05-11 14 views
17

Tarayıcı, etkin setInterval ve setTimeout kimliklerinin kaydını tutuyor mu? Ya da sadece takip etmek için geliştirici bu kadar mı?Tarayıcı aktif zamanlayıcı kimliklerini takip ediyor mu?

Onları takip ederse, BOM üzerinden erişilebilir mi?

+2

Bunun için iyi bir cevap da görmek istiyorum: Bir zamanlayıcı ayarlamak veya uzattı zaman bir avantaj olarak kolayca Örneğin

... vb canlı sayaçları veya attı zamanlayıcılar izlemek, kod eklemek ; Sanırım "hayır" ama asla gerçekten araştırmamıştım. – Pointy

+1

Bir şekilde onları kaydettirmiş olsa bile, hangisinin hangisinin olduğunu nasıl anlarsınız? Sanırım sadece bir zaman aşımı ya da aralığın olduğunu biliyorsan, bilmen gerekmiyor. – Pointy

+0

Haha, DOM yerine "BOM" dedin. – Felix

cevap

4

bunlara erişebilirsiniz her setTimeout kimliği hatırlıyordu iz. SetTimeout/setInterval işlevinin döndürülen değerini kullanarak ve bu değeri diğer yanıtlarda açıklandığı gibi clearTimeout/clearInterval işlevine geçirerek yapabilirsiniz.

Bu, her tarayıcının aralıkları kendi yollarıyla takip etmeyi uygulayacağı için görünmektedir.

w3.org/TR/2009/WD-html5-20090212/no adresinden.html (taslak, ama W3Schools ve http://w3.org/TR/Window bunu neredeyse aynı şekilde açıklamak) - setTimeout ve uzun ve clearTimeout/clearInterval bulup setTimeout geçersiz kılarak

0

Güncelleme: Bu sorunun 2 yönü vardır

.

  1. Tarayıcı, zamanlayıcı kimliklerini takip ediyor mu?
  2. Are onlar erişilebilir

Ben sadece OP genel anlamda "onlar izlenir" anlamına geldiğini 1. (ve daha sonra # 2) için, çünkü bir Geliştirici s olarak tahmin/onlara üzerinde kontrol istiyorum yapabilirsiniz .

Kısacası, evet izlenirler (@s_hewitt'in tarayıcıya göre long değerleri gibi) ve kurulum sırasında zamanlayıcılara bir referans vererek geliştiriciler tarafından yönetilebilirler. Eğer gerekir - Eğer arayarak onları kontrol (örn durdur) bir geliştirici (clearInterval(handleRef) veya clearTimeout(handleRef))

Ancak size mevcut zamanlayıcılar listesini verir varsayılan window.timers veya benzeri koleksiyon bulunmadığından

İhtiyacınız olduğunu düşünüyorsanız kendinizi koruyun.

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

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

Sadece zamanlayıcınıza bir değişken referansı oluşturmanız ve gerekirse/gerekiyorsa adıyla temizlemeniz gerekir.

Başka bir sayfa yüklediğinizde, tüm zamanlayıcılar tarayıcı tarafından otomatik olarak temizlenir, böylece bir tanıtıcıyı tutmanıza ve ihtiyacınız/istemediğiniz sürece bunları temizlemenize gerek kalmaz.

+2

Uhh ... Çok var Bu konuda ciddi şüpheler ... – Pointy

+0

kesinlikle çalışır, ben 10 yıldır bu amaçla kullanıyorum. – scunliffe

+2

Bu çalışır, ancak "clearTimeout ('timerHandle')" nesnesinin adı yerine "clearTimeout (timerHandle)" nesnesini iletirim. Tercih edilen yöntem olan araştırılmadı. –

1

Zamanlayıcı, pencere tarafından nasıl hatırlandığını merak ediyorsanız, bu sizi ilgilendirebilir. Aşağıdaki komut ile

<!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

Bak, tarayıcı O korumak için geliştirici için kadardır yineleme

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

      })(i);   
} 

Sen

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

Hem izleme Küresel zamanlayıcılar ekleyebilir iptal etmek uzun kabul dönmek SetInterval/seInterval işlevleri.

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". 
İlgili konular