2012-01-06 18 views
9

के भीतर निर्धारित thats मैं जावास्क्रिप्ट में एक पुनरावर्ती प्रकार समारोह है कि इस तरह से चलाता है है:एक जावास्क्रिप्ट टाइमआउट खाली करने के लिए कैसे एक समारोह

function loadThumb(thumb) { 
    rotate=setTimeout(function() { 
     loadThumb(next); 
    }, delay); 
} 

नोट: मैं इसे पढ़ने में आसान बनाने के लिए समारोह सरल बना दिया है।

मैं इस

<a href="#" onclick="loadThumb(3); clearTimeout(rotate);">Load thumb 3</a> 

की तरह कहा जाता है "एक" टैग हालांकि, वे टाइमर clearout नहीं है, टाइमर clearTimeout() का कार्य भले ही बुलाया जा रहा है के माध्यम से चक्र जारी है।

कोई विचार क्यों? मुझे लगता है कि इसमें किसी स्कोप समस्या या ऐसा कुछ करने के साथ कुछ करना पड़ सकता है।

उत्तर

13

हाँ, आप एक वैश्विक चर बारी बारी से करने की जरूरत है। सीधे शब्दों में तो जैसे समारोह के बाहर यह घोषणा:

var rotate; 
var delay = 1000; 

function loadThumb(thumb) { 
    alert("loading thumb: " + thumb); 
    rotate = setTimeout(function() { 
     loadThumb(thumb + 1); 
    }, delay); 
} 

इसके अलावा, आप सुनिश्चित करें कि आप से पहले का समय समाप्त स्पष्ट आप loadThumb फोन करने की जरूरत है। अन्यथा आप जिस टाइमर को अभी शुरू कर चुके हैं उसे साफ़ कर देंगे।

<a href="#" onclick="clearTimeout(rotate); loadThumb(3);">Load thumb 3</a> 

बेला: http://jsfiddle.net/63FUD/

+0

और झूठी वापसी। और var rotate नहीं होने से इसे खिड़कियों को स्कॉप्ड var – mplungjan

+0

बनाना चाहिए ओह हाँ, मैं यही कर रहा था, इसे चीजों को भ्रमित करने के बाद इसे कॉल करके, अब यह काम कर रहा है। धन्यवाद। – Talon

0

वापसी लिंक

जब से तुम वर घुमाने उपयोग नहीं कर रहे पर झूठा, यह एक scoping मुद्दा नहीं होना चाहिए, क्योंकि घुमाने खिड़की दायरे में होगा। क्या आप पूरा कोड दिखा सकते हैं?

यह गरीब कोडिंग स्क्रिप्ट इनलाइन करने के लिए माना जाता है - आप पृष्ठ के ईवेंट हैंडलर ऑनलोड देते हैं चाहिए

इसके अलावा, आप एक समारोह है कि एक छवि

कोशिश के लिए कहा जा सकता है अंदर setTimeout नहीं होना चाहिए इस:

var rotate,next=1; 
function loadThumb(thumb) { 
    if (thumb) ... use thumb 
    else ... use next 
} 

function slide() { 
    rotate=setInterval(function() { 
     loadThumb(); 
     next++; 
     if (next>=images.length) next=0; 
    }, delay); 
} 

window.onload=function() { 
    var links = document.getElementsByTagName("a"); 
    if (links[i].className==="thumbLink") { 
    links[i].onclick=function() { 
     var idx = this.id.replace("link",""); 
     loadThumb(idx); 
     clearInterval(rotate); 
     return false; 
    } 
    } 
    document.getElementById("start").onclick=function() { 
    slide(); 
    return false; 
    } 
    document.getElementById("stop").onclick=function() { 
    clearInterval(rotate); 
    return false; 
    } 
    slide(); 
} 

संभालने

<a href="#" id="start">Start</a> 
<a href="#" id="stop">Stop</a> 

<a href="#" id="link0" class="thumbLink">Show 1</a> 
<a href="#" id="link1" class="thumbLink">Show 2</a> 
<a href="#" id="link2" class="thumbLink">Show 3</a> 
2

यह दायरे से मुद्दा हो सकता है तो वैश्विक चर के रूप में बारी बारी से कर सकते हैं और फोन clearTimeout(rotate);

उल्लेख clearTimeout() example

1

यह एक scoping मुद्दा हो सकता है अगर आप rotate बाह्य की घोषणा नहीं कर रहे हैं।

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

var rotate = 0; 
function loadThumb(thumb) { 

    rotate=setTimeout(function() { 
     loadThumb(next); 
    }, delay); 

} 
0

मुझे यकीन है कि वास्तव में आप क्या कर रहे हैं नहीं कर रहा हूँ क्योंकि जहाँ तक मैं आप देख सकते हैं सभी कोड पोस्ट नहीं किया, लेकिन यह मेरे लिए बेहतर लग रहा है:

function loadThumb(thumb) { 

    return setTimeout(function() { 
     loadThumb(next); 
    }, delay); 

} 

और उसके बाद:

<a href="#" onclick="clearTimeout(loadThumb(3));">Load thumb 3</a> 
+0

पर एक उदाहरण पोस्ट किया है क्यों जावास्क्रिप्ट है: - यह डिफ़ॉल्ट है - और क्यों कोई वापसी समारोह में झूठी? – mplungjan

+0

जबकि [लेबल] (https://developer.mozilla.org/en/JavaScript/Guide/Statements#label_Statement) 'जावास्क्रिप्ट:' वहां गलत नहीं है, यह किसी भी उपयोग का नहीं है। आप 'foo:' या 'bar:' या 'sfgasdga:' लिख सकते हैं। कृपया इसे हटा दें, क्योंकि इससे लोगों को लगता है कि यह आवश्यक है। @mplungjan: मैं नहीं कहूंगा कि यह * डिफ़ॉल्ट * है। लिंक (यूआरएल) में इसे प्रोटोकॉल के प्रकार के रूप में प्रयोग किया जाता है ताकि ब्राउजर जानता है कि क्या करना है, लेकिन 'ऑन *' विशेषताओं को हमेशा जावास्क्रिप्ट के रूप में व्याख्या किया जाता है (शायद यही वह मतलब है, उस मामले में, एनवीएम;))। –

+0

मेरे अनुसार यह एक लेबल नहीं है, यह ब्राउजर को बताता है (इसका उपयोग किया गया था) कि आने वाला कोड जावास्क्रिप्ट है। यह केवल उपयोगी है यदि ब्राउजर आईई है और पृष्ठ पर पहली स्क्रिप्ट वीबीस्क्रिप्ट है क्योंकि (कम से कम इसका उपयोग किया जाता है) इनलाइन ईवेंट हैंडलर में डिफ़ॉल्ट भाषा को वीबीस्क्रिप्ट में सेट करेगा। – mplungjan

0

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

<script type="text/javascript"> 
    var timeouts = timeouts || {}; 

    function createTimeout(name, milliseconds, callback) { 
     timeouts.name = setTimeout(callback, milliseconds); 
    } 

    function removeTimeout(name) { 
     if (typeof(timeouts.name) !== undefined) { 
      clearTimeout(timeouts.name); 
      timeouts.name = undefined; 
     } 
    } 

    createTimeout('foo', 5000, function() { 
     alert('timeout') 
    }); 
</script> 

मैं भी jsFiddle http://jsfiddle.net/AGpzs/

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