2012-02-14 13 views
7

मैंने एक बिल्कुल स्थित ड्रॉप-डाउन मेनू लिखा है। मैं एक कस्टम घटना को ट्रिगर कर रहा हूँ जब इस मेनू खोलता है:windows.document पर कस्टम jQuery ईवेंट को कैसे बबल करें?

ps.DropDown.prototype._onOpenComplete = function() { 
    $(this).trigger('MENU_OPEN', [this]); 
} 

यह काम करता है महान जब मुझे पता है ps.DropDown का जो उदाहरण लक्षित करने के लिए:

var dd = new ps.DropDown(); 
$(dd).on('MENU_OPEN', fn); 

हालांकि, मैं करने के लिए अपने कस्टम घटना के लिए चाहते हैं window.document पर बबल करें यदि ईवेंट प्रचार से रोका नहीं गया है। उदाहरण के लिए:

var dd = new ps.DropDown(); 
$(dd).on('MENU_OPEN', function(event, instance) { 
    // this would stop bubbling to $(window.document) 
    // event.stopPropagation(); 
}); 
$(window.document).on('MENU_OPEN', function(event, instance) { 
    // bubbled! 
}); 

क्या jQuery के साथ इसे पूरा करने का कोई तरीका है?

संपादित सादृश्य

एक बटन तत्व पर एक क्लिक करके एक उदाहरण जोड़ने के लिए एक घटना को ट्रिगर किया जाएगा। यह घटना पैरेंट-एलिमेंट चेन को तब तक बुलबुला जारी रखेगी जब तक कि यह window.document तक पहुंच न जाए (जब तक किसी ईवेंट श्रोता द्वारा प्रचार रोक दिया जाता है)। मुझे कस्टम इवेंट्स के लिए इस व्यवहार को संश्लेषित करने में दिलचस्पी है कि अगर event.stopPropagation() को नहीं कहा जाता है, तो यह window.document (या $ .event, या कुछ अन्य विंडो ग्लोबल, इससे कोई फर्क नहीं पड़ता) पर बबल होगा

+0

आपका कोड ठीक दिखता है जिसने 'MENU_OPEN' ईवेंट की सदस्यता ली है, उसे '.trigger ('MENU_OPEN)' के साथ ट्रिगर किया जाना चाहिए। – ShankarSangoli

+1

हां, लेकिन मैं ऐसे समाधान की तलाश में हूं जिसके लिए ps.DropDown के उदाहरण के संदर्भ की आवश्यकता नहीं है। मैं ईवेंट को window.document पर बबल करना चाहता हूं। – thesmart

उत्तर

10

मुझे लगता है कि आप $ .event.trigger मैन्युअल फोन करने के लिए देख रहे हैं:

$.event.trigger('myCustomEvent', someDataObj, someDomElement, false); 

पिछले पैरामीटर का उपयोग किया जाता है "केवल हैंडलर" ध्वज के लिए, इस मामले में झूठी है क्योंकि हम तत्व हैंडलर को ट्रिगर करना चाहते हैं और फिर प्रत्येक पेरेंट नोड पर फिर से ट्रिगर करना चाहते हैं। इस फैशन में आप खिड़की और नोड के बीच कुछ भी "myCustomEvent" बांध सकते हैं जहां यह घटना उत्पन्न हुई थी।

-1

अगर मैं एक विशिष्ट संदर्भ के बिना विश्व स्तर पर कस्टम घटनाओं की जरूरत है, मैं कहीं भी अपने लटकती बारे में कुछ भी जानने के बिना पेज

$('body').trigger('MENU_OPEN', [this]); 

अब आप उस घटना को सुन सकते हैं के शरीर पर ईवेंट ट्रिगर

$('body').on('MENU_OPEN',function(event, dropDown){ 
    // bubbled 
}); 

किसी ईवेंट के रूप में कभी भी window.document का उपयोग नहीं किया लक्ष्य।

+1

उत्तर देने के लिए धन्यवाद, लेकिन मैं $ (window.document) का उपयोग करने से बचने की कोशिश नहीं कर रहा हूं। उदाहरण के लिए, जब मैं एक बटन पर क्लिक करता हूं, तब तक क्लिक करें जब तक कि यह window.document को हिट न करे तब तक प्रत्येक अभिभावक में बुलबुले क्लिक करें। किसी भी मूल तत्व पर एक श्रोता संभावित रूप से घटना को संभाल सकता है। मैं इसे कस्टम घटनाओं के लिए दोहराना चाहता हूं। – thesmart

-1

यह एक डोम तत्व से कस्टम घटनाओं को गति प्रदान करने आवश्यक नहीं है:

$(window.document).bind('dropDownHasOpened', function() { 
    console.log($(this)); 
    // 'this' is window.document 
}); 

ps.DropDown.prototype._onOpenComplete = function() { 
    $.event.trigger('dropDownHasOpened'); 
} 
+1

मुझे समझ में आता है कि यह आवश्यक नहीं है। मेरे उदाहरण में, मैं $ (window.document) पर ट्रिगर नहीं कर रहा हूं लेकिन ड्रॉपडाउन इंस्टेंस पर। मुझे उस घटना से ऊपर की ओर $ (window.document) की घटना को बुलबुले करने में दिलचस्पी है, जैसे कि बटन क्लिक ईवेंट को अपने माता-पिता के माध्यम से window.document पर बुलबुला किया जाएगा। – thesmart

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