2013-06-03 5 views
5

केवल जावास्क्रिप्ट, कोई jquery।विशेष समय के लिए एक क्लिक ईवेंट हैंडलर को अक्षम कैसे करें?

कोड प्रकार है:

window.onload = addListeners; 
function addListeners(){ 
    for(var i = 0 ; i < document.getElementsByClassName('arrow').length; i++){ 
    if(window.addEventListener){ 
     document.getElementsByClassName('arrow') [i].addEventListener('click', func , false); 

    }else{ 
     document.getElementById('arrow') [i].attachEvent('onclick' , func); 
    } 
} 
} 


function func(){ 
//Takes exactly 5 seconds to execute 
} 

अब, मैं जब समारोह 'समारोह()' चल रहा है 5 सेकंड के लिए 'क्लिक' को निष्क्रिय करना चाहते। और, फिर 'func()' पूरी तरह से निष्पादित होने के बाद, क्लिक को फिर से स्वचालित रूप से सक्षम किया जाना चाहिए।

यह केवल जावास्क्रिप्ट का उपयोग कैसे करें?

+1

क्या 'func' में कुछ असीमित है? –

+0

हां! func asynchronous –

उत्तर

4

Curts answer पर मेरी टिप्पणी विस्तार से बता दें:

जब समारोह की घोषणा समारोह आपको दो बातें कर सकते हैं:

function func() { 
    if (!func.isRunning) { 
     func.isRunning = true; 
     /* logic goes here */ 
     func.isRunning = false; 
    } 
} 

या आप एक बंद करने और दुकान इसके अंदर isRunning बना सकते हैं:

var func = (function() { 
    var isRunning = false; 
    return function() { 
     if (!isRunning) { 
      isRunning = true; 
      /* logic goes here */ 
      isRunning = false; 
     } 
    }; 
})(); 

दूसरा उदाहरण बंद करने के अंदर केवल एक निजी चर बना सकता है।


इसकी ज्यादातर डिजाइन पैटर्न के बारे में कुछ डेवलपर्स सीधे उदाहरणों जैसे कार्यों पर चर को स्टोर करना पसंद नहीं करते हैं। केवल अंतर यह है कि अगर कोई func.isRunning = true सेट करना चुनता है तो फ़ंक्शन फिर से नहीं चलाया जा सकता है और इसलिए स्वयं को रीसेट नहीं किया जा सकता है।

5

क्लिक ईवेंट को अक्षम करने के बजाय, यह देखने के लिए एक चर जांचें कि यह वर्तमान में चल रहा है या नहीं।

var funcRunning = false; 
function func(){ 
    if (funcRunning) return; 
    funcRunning = true; 

    //Function logic here 

    funcRunning = false; 
    return //whatever 
} 

इस तरह अपने कार्य को चलाने के लिए, समारोह बस अपने पूरा इसके वर्तमान रन तक अपने तर्क पर अमल नहीं होगा 5 सेकंड का समय लगेगा अनुमान लगा नहीं।

संपादित करें:@NULL के रूप में सुझाव दिया है, एक बेहतर तरीका वैश्विक प्रदूषण को रोकने के लिए समारोह पर ही बूलियन चर स्टोर करने के लिए किया जाएगा:

function func(){ 
    if (func.IsRunning) return; 
    func.IsRunning = true; 

    //Function logic here 

    func.IsRunning = false; 
    return //whatever 
} 
+2

है या आप ग्लोबल प्रदूषण को रोकने के लिए बूलियन को फ़ंक्शन पर ही स्टोर कर सकते हैं। – andlrc

+0

अच्छा धन्यवाद .. मुझे –

+0

@NULL फ़ंक्शन के अंदर परिवर्तनीय घोषित करने के लिए प्रत्येक बार फ़ंक्शन निष्पादित होने पर घोषित किया जाएगा, इसलिए आप फ़ंक्शन की एकाधिक कॉल में चर वैल्यू को साझा करने में सक्षम नहीं होंगे। जब तक मैं गलत नहीं हूँ? – Curt

1

अपने कार्य अतुल्यकालिक है (यह ajax अनुरोध भेजता है, जहां तक ​​मैं समझ गया), आप उस अनुरोध के लिए बेहतर "सफलता" कॉलबैक तैयार करेंगे और वहां funcRunning ध्वज को संभालेंगे।

var funcRunning = false; 
function func() { 
    if (funcRunning) { 
    return; 
    } 
    funcRunning = true; 
    var xmlhttp = new XmlHttpRequest(); 
    xmlhttp.open('GET', '/xhr/test.html', true); 
    xmlhttp.onreadystatechange = function() { 
    if (xmlhttp.readyState == 4) { 
     if (xmlhttp.status == 200) { 
     // do something. 
     funcRunning = false; 
     } 
    } 
    }; 
} 

पी.एस.:

यहाँ एक उदाहरण है वर्तमान उदाहरण XmlHttpRequest उदाहरण (क्रॉसब्रोसर नहीं) बनाने में सबसे सही नहीं है। यह केवल एक उदाहरण के रूप में दिखाया गया है।

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