2011-01-17 22 views
10

मैं इस बात पर फंस गया हूं कि jQuery में नामित कस्टम ईवेंट कैसे काम करना चाहिए। मुझे the doc से इंप्रेशन मिला है जो एक नामित कस्टम इवेंट ट्रिगर करने से केवल उस घटना से जुड़ी हैंडलर को ही आग लग जाएगी। इसके बजाए, ऐसा लगता है कि नामस्थान बहुत अधिक अनदेखा है। नीचे दिए गए उदाहरण और यहाँ रहते कोड: http://jsfiddle.net/kZCBw/1/नामांकित कस्टम ईवेंट ट्रिगर

$(document) 
     .bind("reset.one", function(){ console.log("reset.one event detected");}) 
     .bind("reset.two", function(){ console.log("reset.two event detected");}) 
     .bind("cheese", function(){ console.log("cheese event detected");}); 

     $("#btn1").click(function(){ 
      console.log("firing reset.one event"); 
      $(this).trigger("reset.one"); 
     }); 
     $("#btn2").click(function(){ 
      console.log("firing reset.two event"); 
      $(this).trigger("reset.two"); 
     }); 
     $("#btn3").click(function(){ 
      console.log("firing reset event"); 
      $(this).trigger("reset"); 
     }); 

     //btn1 click should only trigger handlers bound to "reset.one" 
     //and yet it triggers anything starting w/ "reset" 

मैं क्या याद आ रही है?

अग्रिम धन्यवाद! -matt

+0

साइड नोट: एक अच्छा जवाब के लिए jQuery 2.1.4 और jQuery 3.0 – ViRuSTriNiTy

उत्तर

11

मैं कम से कम आपके उदाहरण को एक अवलोकन जोड़ सकता हूं।

यदि आप बटन को श्रोता बनाते हैं (http://jsfiddle.net/kZCBw/2/ देखें), दस्तावेज़ीकरण में नमूना कोड को बेहतर ढंग से प्रतिबिंबित करते हुए, यह अपेक्षा के अनुसार काम करता है।

लेकिन यदि आप इसे डीओएम पेड़ में कहीं भी ऊपर ले जाते हैं (http://jsfiddle.net/kZCBw/3/ देखें), यह विफल हो जाता है।

सबसे पहले, मैं शक था कि यह था, क्योंकि नाम स्थान घटना वस्तु के साथ बुलबुले नहीं किया जा रहा था, लेकिन मैं निम्नलिखित कोड (http://jsfiddle.net/kZCBw/4/ पर लाइव उदाहरण) संलग्न:

$('*').bind('reset', function(e){ 
    console.log(e.type + '.' + e.namespace + ' detected at ' + e.currentTarget); 
}); 

आप देख सकते हैं , नामस्थान बस ठीक से बुलबुला जा रहा है।

व्यवहार आप (उच्च स्तर डोम नोड्स पर प्रभावी शेष नाम स्थान) के लिए देख रहे स्पष्ट documentation में एक उदाहरण प्रस्तुत किया नहीं है, मुझे लगता है कि जिस तरह से namespaced घटनाओं काम होना चाहिए। इस हद तक, अब आप "बग या फीचर" शिकार शुरू कर सकते हैं।

jQuery स्रोत कोड को छूए बिना जो भी खोज रहे हैं उसे पूरा करने का एक शानदार तरीका यह है कि इवेंटऑब्जेक्ट का उपयोग करके ईवेंट को फ़िल्टर करना है (मुझे संदेह है कि इस घटना के दौरान jQuery में पहली बार नामांकित घटनाएं पूरी की जाती हैं) हैंडलर।

+0

+1 के साथ अच्छी तरह से काम करता है। ध्यान दें कि परीक्षण करने के लिए उचित संपत्ति 'e.namespace' है। – lonesomeday

+0

दयालु शब्दों और सहायक सलाह के लिए अकेले लोगों के लिए धन्यवाद। ओपी को एक नोट: आप [jQuery दस्तावेज़ीकरण] (http://api.jquery.com/category/events/event-object/) में EventObject का उपयोग करने के तरीके पर एक मार्गदर्शिका प्राप्त कर सकते हैं। वैकल्पिक रूप से, बस 'console.log (e)' में डालें, जहां 'e' को EventObject उदाहरण में असाइन किया गया है, आपको ऑब्जेक्ट का एक बहुत ही त्वरित अवलोकन देगा और इसका उपयोग करने के तरीके पर अंतर्ज्ञान विकसित करने में आपकी सहायता करेगा। –

+0

धन्यवाद स्टीवन और लोन्सोमेडे। कुछ और खुदाई के बाद, यह पता चला कि यह एक ज्ञात मुद्दा है। देखें: http://bugs.jquery.com/ticket/6913 तो, हाँ, ऐसा लगता है कि नामस्थान/क्लासनाम – busticated

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