2009-02-05 4 views
35

क्या कोई जानता है कि ईवेंट हैंडलर के सेट को कैसे अनइंड करना है, लेकिन बाद में उन्हें फिर से बांधने के लिए उन्हें याद रखें? कोई सुझाव?jQuery: ईवेंट हैंडलर को बाद में फिर से बांधने के लिए

+0

क्या आपके ईवेंट में एक ही हैंडलर फ़ंक्शन है? या सभी अलग। – bendewey

+0

यह मामला नहीं होना चाहिए। आइए दिखाएं कि वे सभी अलग हैं और मुझे नहीं पता कि वे – glaz666

उत्तर

23

आइटम के डेटा में एक ईवेंट तत्व है। यह आपकी शुरुआत होनी चाहिए, आप अपने तत्वों को पढ़ सकते हैं और हैंडलर को अनइंडिंग से पहले सरणी में स्टोर कर सकते हैं। अगर आपको और मदद की ज़रूरत है तो टिप्पणी करें। मुझे यह विचार $ .fn.clone विधि पढ़ने से मिला है, इसलिए इसे भी देखें।

$(document).ready(function() { 
    $('#test').click(function(e) { 
     alert('test'); 
     var events = $('#test').data("events"); 
     $('#test').unbind('click', events.click[0]); 
    }); 
}); 

<a id="test">test</a> 
+0

सुपर। यह काम कर सकता है। मैं यह – glaz666

+1

देखूँगा मैं इस समस्या के समाधान के आसपास भी देख रहा था, और यह उत्तर काफी काम करता है। अधिक सामान्यता के लिए, आप ईवेंट का उपयोग कर सकते हैं। एक इटरेटर के माध्यम से क्लिक करें। – Achimnol

+3

jQuery 1.4.2 में, उन्होंने बदल दिया कि ईवेंट कैसे संग्रहीत किए जाते हैं, इसलिए यह काम नहीं करेगा: http: // ब्लॉग।jquery.com/2010/02/19/jquery-142-released/। मुझे यकीन नहीं है कि आपको इसके बजाय क्या करना है। –

0

आदेश में एक ईवेंट हैंडलर आप अनबाइंड में हैंडलर समारोह में उत्तीर्ण होना निकल करने के लिए()। तो आपके पास पहले से ही हैंडलर फ़ंक्शन है, आपको बस इतना करना है।

+0

क्या हैं, मैंने सोचा कि यदि आप एक विशिष्ट हैंडलर फ़ंक्शन नहीं पारित करते हैं, तो उस ऑब्जेक्ट के लिए सभी घटनाओं पर असंतुलित लागू होता है? – Helmut

+0

@ हेल्मुट हां 'अनबिंड' सभी हैंडलर को अनबाइंड करेगा यदि आप इसे बिना किसी तर्क के कहते हैं। जब तक आप उनका संदर्भ नहीं रखते हैं तब तक आप उन्हें फिर से बाध्य नहीं कर पाएंगे। आप उन घटनाओं को भी अनदेखा कर सकते हैं जिन्हें आप अनजान हैं - उदाहरण के लिए किसी अन्य स्क्रिप्ट द्वारा बाध्य। एक विशिष्ट हैंडलर के साथ अनबिंड कॉल करना सबसे अच्छा है ताकि आप सुनिश्चित हो सकें। – meouw

2

अब एक अच्छा jQuery प्लगइन copyEvents कहा जाता है, दूसरे के लिए एक वस्तु से जो प्रतियां घटनाओं है। यह आसानी से एक तत्व से "सहेजने" घटनाओं के लिए उपयोग किया जा सकता है और उन्हें बाद में वापस ला सकता है। बस एक और विकल्प :)

+0

वह लिंक मर चुका है। –

8

यहां यह प्राप्त करने का तरीका है, एक चयन पर storeEvents और restoreEvents विधियां प्रदान करता है। storeEvents इस समय घटनाओं का एक स्नैपशॉट लेता है जिसे इसे कहा जाता है। restoreEvents पिछले पिछले स्नैपशॉट को पुनर्स्थापित करता है। बहाल करते समय अनबाइंडिंग को पैरामीटर करने के लिए इसे थोड़ा मोड़ने की आवश्यकता हो सकती है, हो सकता है कि आप अंतिम स्नैपशॉट के बाद बाध्य घटनाएं रखना चाहें।

(function($){ 

    function obj_copy(obj){ 
      var out = {}; 
     for (i in obj) { 
      if (typeof obj[i] == 'object') { 
       out[i] = this.copy(obj[i]); 
      } 
      else 
       out[i] = obj[i]; 
     } 
     return out; 
    } 


    $.fn.extend({ 

     storeEvents:function(){ 
      this.each(function(){ 
       $.data(this,'storedEvents',obj_copy($(this).data('events'))); 
      }); 
      return this; 
     }, 

     restoreEvents:function(){ 
      this.each(function(){ 
       var events = $.data(this,'storedEvents'); 
       if (events){ 
        $(this).unbind(); 
        for (var type in events){ 
         for (var handler in events[type]){ 
          $.event.add(
           this, 
           type, 
           events[type][handler], 
           events[type][handler].data); 
         } 
        } 
       } 
      }); 
      return this; 
     } 

    }); 
})(jQuery); 
7

के बाद से jQuery 1.4.2+ परिवर्तन कैसे ईवेंट हैंडलर्स जमा हो जाती है, यह प्रासंगिक लगता है:

सबसे अच्छा तरीका मैंने पाया घटना नेमस्पेसिंग उपयोग करने के लिए किया गया था:

var ary_handlers = [ fn_highlight, fn_onpress, fn_cleanup ]; 
for (idx = 0; idx < ary_handlers.length; idx++){ 
    $('#test').bind('click.foobar',ary_handlers[idx]); 
} 

// and then later: 
$('#test').unbind('.foobar'); 

ऊपर के उदाहरण में , सभी foobar घटनाओं unbound। ध्यान दें कि यदि आप महीन अनाज नियंत्रण की जरूरत है, आप प्रत्येक क्लिक हैंडलर नाम स्थान और संचालकों के अपने सरणी से संबद्ध हों सकता है:

var ary_handlers = [ fn_highlight, fn_onpress, fn_cleanup ]; 
for (idx = 0; idx < ary_handlers.length; idx++){ 
    $('#test').bind('click.ns_' + String(idx), ary_handlers[idx]); 
} 

// and then later you could pick off a specific one to unbind 
$('#test').unbind('.ns_2'); 
-2

निक Craver jQuery 1.4.2+ के लिए correct answer प्रतीत होता है। इसमें एक उपयोगी fiddle भी शामिल है। उनका समाधान आपको एक jQuery तत्व से जुड़े सभी ईवेंट हैंडलर को पुनर्प्राप्त करने की अनुमति देता है और यह पता लगाने के लिए कि वे किस हैंडलर से जुड़े हुए हैं।

$(document).ready(function() { 
    $('#test').click(function(e) { 
     e.preventDefault(); 
     alert('test'); 
     $('#test').unbind('click', e.handler); 
     //Do Something... 
     $('#test').click(); 
    }); 
}); 

<a id="test">test</a> 

event.handler वर्तमान हैंडलर कि घटना प्राप्त हुआ है, तो यह छोड़ते हुए द्वारा आप अन्य संचालकों रख सकता है रिटर्न:

+4

जो लोग वोट देते हैं उन्हें वोट देने का कारण प्रदान करना चाहिए। व्यक्ति को सीखने में मदद करता है और थोड़ा जवाबदेही प्रदान करता है ... कभी-कभी नीचे मतदाता गलत होता है। हर कोई सीखता है। – traday

0

आप event.handler पैरामीटर का उपयोग कर सकते हैं।

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