2010-07-20 18 views
8

का उपयोग कर लूप में बनाए गए जावास्क्रिप्ट टाइमर या अंतराल मैं प्रत्येक जोड़े को जांचने के लिए कुछ तत्वों पर टाइमर या अंतराल पाश सेट करने के लिए jQuery का उपयोग कर रहा हूं। मैंने टाइमर सेट करने और यह जांचने की कोशिश की है कि मुझे इसे पुनरारंभ करना चाहिए, या सेटिंग और अंतराल और जांच करनी चाहिए कि मुझे इसे रोकना चाहिए या नहीं।बंदरगाह

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]); 
    } 
} 

आईडी वर्ग मदों के लिए की ID_1, ID_2, id_3 हैं:

सरलीकृत हालांकि, इस बुनियादी तौर पर मैं क्या जरूरत है। लेकिन मुझे बस 3 अलर्ट मिलते हैं जो सभी id_3 देते हैं। मेरे कोड में मैंने 'यह' पास करने की कोशिश करना बंद कर दिया, लेकिन इस मुद्दे को समझने के लिए इसे सरल बना दिया।

प्रत्येक बार चर को एक नए पते पर कॉपी करने के लिए मैं इसे कैसे प्राप्त कर सकता हूं? मुझे पता है मुझे बंद करने का उपयोग करने की जरूरत है। ऐसा लगता है कि अन्य var No mater क्या संदर्भित किया जा रहा है।

मैं बहुत तरह टाइमर के साथ एक पाश के लिए यह सरल बनाने की कोशिश की:

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

लेकिन मुझे लगता है मैं सिर्फ अपनी समस्या बदतर बना रही हूँ और कहा कि कुछ भी करने को नहीं लगता है।

मैंने पिछले प्रश्नों की खोज की है, लेकिन अधिकांश इसे विशिष्ट मुद्दे को कम करने के बजाय अतिरिक्त कोड से भरे हुए हैं और किसी अन्य तरीके से हल किए गए हैं। मैं समझना चाहता हूं कि यह उदाहरण काम करने के द्वारा यह कैसे बेहतर काम करता है। मैंने इसे लिखते समय प्रबंधन किया, यह पता लगाने के लिए कि मैं टाइमर को एक सहायक कार्य के साथ सेट कर सकता हूं।

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

इसके बिना यह कैसे किया जा सकता है? क्या कोई बेहतर तरीका है?

+3

आपको वास्तव में * सभी * आपके स्थानीय चर को 'var' के साथ घोषित करना चाहिए, जिसमें लूप इंडेक्स शामिल हैं। – Pointy

उत्तर

3

आप एक बंद में हैं जब आप प्रत्येक उपयोग करते हैं, तो आप सिर्फ भूल गए हैं वर है

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

* माथे smacks * मैं वास्तव में सभी प्रकार के स्थानों में var की कोशिश की, एक को छोड़कर, हे। – phazei

4

समारोह दायरे में अपने चर निजी बनाने के लिए चर 'MyID' अनाम कार्य करने के लिए स्थानीय,

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

तो आप प्रत्येक तीन सेकंड में मिलान किए गए प्रत्येक तत्व पर myFunction चलाने के लिए चाहते हैं?

इस प्रयास करें:

$('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() में हालत नहीं तो समारोह के कार्यक्रम में ही पहले की तरह ही तत्व के साथ 3 सेकंड में पुन: चलाने के लिए आप, काम हो गया पूरा किया जाता है तो। आप इसे विभिन्न तत्वों पर जितनी बार चाहें उतनी बार कॉल कर सकते हैं, प्रत्येक कॉल का अपना elem होता है।

मैं पिछली संभव पल तक अपने आंतरिक के साथ काम करने में देरी करता हूं और आसपास के सामानों को पास करना पसंद करता हूं। something() आईडी या जो भी हो, के बारे में चिंता करें।

सहयोगी सरणी के साथ अन्य जिमनास्टिक में से कोई भी नहीं (new Array() के बजाय आप केवल {} का उपयोग कर सकते हैं), या clearInterval, या आईडी आवश्यक हैं।

वास्तव में आपके समाधान को संबोधित करने के लिए, जैसा कि मारिमुथु ने कहा था, आपने myID की घोषणा से var छोड़ा, जिसका अर्थ है कि इसका वैश्विक और यह प्रत्येक पुनरावृत्ति को अधिलेखित करता है।नतीजा यह है कि जब setInterval बंद होने के माध्यम से एक अद्वितीय स्थानीय myID प्राप्त करने के बजाय myFunction को आमंत्रित करता है, तो आप वैश्विक स्तर प्राप्त करते हैं जो पहले ही खाली समय से अधिक हो चुका है।

संबंधित मुद्दे