2010-07-20 16 views
8

JQuery kullanarak birkaç saniyede bir zamanlayıcı veya aralık döngüsü kurmak için her birkaç saniyede bir kontrol edin. Bir zamanlayıcı ayarlamayı denedim ve yeniden başlatmalı mıyım yoksa kontrol etmeli mi ve kontrol etmeli mi ve kontrol etmeli mi diye kontrol et. sınıf ürün içinjavascript zamanlayıcı veya kapanış kullanılarak döngüde oluşturulan aralıklar

var mytimers = new Array(); 
$('div.items').each(function() { 
    myID = $(this).attr('id'); 
    mytimers[myID] = setInterval(function() { myFunction(myID) } , 3000) 
}); 
function myFunction(param) { 
    alert(param); 
    if (something()) { 
     clearInterval(mytimers[param]); 
    } 
} 

kimlikleri değiştirinID_1, ID_2, id_3 şunlardır: basitleştirilmiş olsa

, bu ne ihtiyacım temelde. Ama ben sadece 3 tane uyarı alıyorum. Kodumda 'bunu' geçmeye çalıştım, ancak sorunu çözmek için basitleştirmeye devam ettim.

Her defasında değişkeni yeni bir adrese kopyalamak için nasıl alabilirim? Kapatma kullanmam gerektiğini biliyorum. Ne var ne yok başka referans referans görünüyor.

ben şöyle zamanlayıcılar ile bir döngü için basitleştirerek çalıştı:

function tester(item) { 
    return function() { 
     alert(item); 
    }; 
} 
for(x=1;x<=3;x++) { 
    setTimeout('(function() { tester(x) })(x)' , 3000); 
} 

Ama sadece benim sorun çözülemez hale düşünüyorum ve bu bir şey yapmak gibi görünmüyor.

Daha önceki soruları aradım, ancak çoğu özel sorunu çözmek yerine tonlarca ekstra kodla dolduruldu ve başka bir şekilde çözüldü. Bu örnek çalışmanın nasıl yapılacağını daha iyi anlamak istiyorum. Bunu yazarken, zamanlayıcıyı bir yardım işleviyle ayarlayabileceğimi anlamaya çalıştım.

function tester(item) 
    alert(item); 
function myTimer(item) 
    setInterval(function() { tester(item); }, 3000); 
for(x=1;x<=3;x++) 
    myTimer(item); 

Bu nasıl o olmadan yapılabilir? Daha iyi bir yolu var mı?

+3

Gerçekten de, tüm yerel değişkenlerinizin döngü değişkenleri de dahil olmak üzere "var" ile bildirilmesi gerekir. – Pointy

cevap

3

her kullandığınızda, bir kapatma konum, sadece unutmuş var dosya

var mytimers = new Array(); 
$('div.items').each(function() { 
    **var** myID = $(this).attr('id'); 
    mytimers[myID] = setInterval(function() { myFunction(myID) } , 3000) 
}); 
function myFunction(param) { 
    alert(param); 
    if (something()) { 
     clearInterval(mytimers[param]); 
    } 
} 
+0

* alnı çıkarıyor * Ben aslında, her yerde, her yerde var denedim, bir, ha. – phazei

4

fonksiyon kapsamı içinde değişken gizli yapmaya değişken 'MyID' anonim işlevine yerel,

var myID = $(this).attr('id'); 
1

Bu nedenle, her üç saniyede bir eşleşen öğelerin her birine myFunction mu çalıştırmak istiyorsunuz?

bu deneyin:

$('div.items').each(myFunction(this)); 

var myFunction = function(elem) { 
    return function() { 
     if (something(elem)) { 
      //return or do something with elem 
     } else { 
      window.setTimeout(myFunction(elem), 3000); 
     } 
    } 
}; 

something() koşul değil fonksiyon programları kendisi daha önce olduğu gibi aynı eleman ile 3 saniye içinde tekrar çalıştırmak için eğer, bitti karşılanmaktadır edin. Bunu farklı öğeler üzerinde istediğiniz kadar çok çağırabilirsiniz, her aramanın kendine ait elem vardır.

Elem gibi nesneleri geçmeyi ve mümkün olan en son ana kadar çalışanlarıyla çalışmayı ertelemeyi tercih ederim. something() kimliğine veya herhangi bir şeye endişe etsin.

İlişkisel diziyle (new Array() yerine {} kullanabilirsiniz) diğer jimnastiklerin hiçbiri veya clearInterval veya ID'ler gereklidir. Marimuthu'nun dediği gibi, aslında çözümünüzü ele almak için, myID bildirgesinden var'u terk ettiniz, bu da global anlamına gelir ve her yinelemenin üzerine yazılır.Sonuç olarak, setInterval, myID ile yerel bir myID kapısının kapatılması yerine myFunction'u çağırdığında, daha önce umuz zamanların üzerine yazılan global olanı elde edersiniz.

İlgili konular