2010-07-19 19 views
17

मैं डीओएम तत्वों से स्वतंत्र कस्टम jQuery घटनाओं का उपयोग करना चाहता हूं, लेकिन मुझे यकीन नहीं है कि इसे प्राप्त करने का सबसे अच्छा तरीका क्या है।jQuery में वैश्विक कस्टम इवेंट

यहाँ क्या मैं के साथ बाहर शुरू कर दिया:

// some system component registers an event handler 
$().bind("foo.bar", handler); // foo is my app's namespace, bar is event name 
// another part of the system fires off the event 
$().trigger("foo.bar", { context: "lorem ipsum" }); 

jQuery के स्रोत को देखने के बाद, विशेष रूप से वैश्विक AJAX घटनाओं के अपने को संभालने में, मैं लगा यह काम करना चाहिए:

$.fn.bind("foo.bar", handler); 
// ... 
$.event.trigger("foo.bar", { context: "lorem ipsum" }); 

हालांकि, ऐसा लगता कि मेरे हैंडलर समारोह को कभी भी बुलाया नहीं जाता है।

क्या मैं शायद इस गलत तरीके से जा रहा हूं?

+0

यह वास्तव में है "", http://docs.jquery.com/Namespaced_Events – MyGGaN

+0

मुझे लगता है कि इस अनुच्छेद इस प्रश्न के लिए उपयोगी है यह देखने के http://tdanemar.wordpress.com/2010/01/19/global -वृत्त-साथ-jquery/ –

उत्तर

32

यदि आप jQuery >1.4 का उपयोग कर रहे हैं तो $() एक खाली jQuery संग्रह देता है जिसका अर्थ यह होगा कि कोई ईवेंट हैंडलर वास्तव में कुछ भी बाध्य नहीं है। 1.4 से पहले यह jQuery(document) जैसा ही होगा।

यह बेहतर हो सकता है बस एक वैश्विक नाम स्थान (एक वास्तविक वस्तु) है और फिर उस ईवेंट जोड़ने के लिए:

var FOO = {}; 

$(FOO).bind("foo.bar", handler); 

$(FOO).trigger("foo.bar", { context: "lorem ipsum" }); 
+1

मुझे एहसास नहीं हुआ था कि आप एक नियमित वस्तु के आसपास jQuery को लपेट सकते हैं/चाहिए - लेकिन यह बहुत अच्छा काम करता है, और इसका मतलब यह भी हो सकता है कि मुझे ईवेंट नाम को नाम देने की आवश्यकता नहीं है (जैसा कि किसी विशेष घटना को बाध्यकारी करना है) ऑब्जेक्ट पहले से ही संघर्ष को रोकता है)। धन्यवाद! – AnC

+6

याद रखने की एक बात यह होगी कि जब हम किसी भी जावास्क्रिप्ट ऑब्जेक्ट को ईवेंट बाध्य कर सकते हैं, तो हम उन्हें 'अनबिंड' से नहीं हटा सकते हैं। इसके लिए 'removeData' का उपयोग करने की आवश्यकता है। – Anurag

+1

मुझे यह नहीं पता था! इसे पढ़ने के लिए एक अच्छा संसाधन खोजने की आवश्यकता होगी ... – AnC

3

मैं अपने रास्ते यहाँ पाया क्योंकि मैं का उपयोग कर प्रकाशक/ग्राहक पैटर्न लागू करने के लिए देख रहा था jQuery का उपयोग कर नामित कस्टम घटनाओं। जबकि स्वीकृत समाधान $ .event.trigger() को ऐसे तरीके से उपयोग करने का एक तरीका है जो डीओएम तत्वों से बंधे नहीं है, यह एक प्रकाशक/ग्राहक वास्तुकला में एक वास्तविक वैश्विक घटना कार्यान्वयन के लिए अच्छा काम नहीं करेगा (जैसे कि कई एसिंक्रोनस क्रियाओं के साथ जटिल यूआई), जहां आप मनमानी वस्तुओं/तत्वों को एक कस्टम घटना के लिए सुनना चाहते हैं।

प्रयोग के माध्यम से, मुझे पता चला है कि एनसी की घटनाओं को फायरिंग क्यों नहीं किया गया था इसका असली जवाब यह है कि jQuery स्पष्ट रूप से "।" (अवधि) चरित्र कस्टम घटना नामों में चरित्र ... लेकिन अंडरस्कोर ठीक प्रतीत होता है।

तो, यदि आप अपनी घटनाओं को foo_bar (foo.bar की बजाय) नाम देते हैं, तो आपके कोड को अपेक्षित कार्य करना चाहिए। JQuery 1.4.4 के साथ परीक्षण किया।

संपादित करें: बस स्पष्ट होने के लिए - मेरा मतलब है कि कस्टम ईवेंट के लिए अवधि की अनुमति नहीं है यदि आप $ .event.trigger() तंत्र का उपयोग करना चाहते हैं। परिदृश्यों में जहां वस्तुओं या तत्वों द्वारा घटनाओं को ट्रिगर किया जा रहा है, अवधि ठीक लगती है ... सुनिश्चित नहीं है कि यह एक बग या डिज़ाइन है।

+0

दिलचस्प लगता है - क्या आपके पास $ .event.trigger के DOM-मुक्त उपयोग को समझाते हुए एक लिंक है? आप इस मुद्दे को jQuery लोगों को भी रिपोर्ट करना चाहेंगे, उन्हें यह तय करने दें कि यह एक बग है या नहीं। मैंने तब से विकल्पों को देखना शुरू कर दिया है - PubSubJS बहुत अच्छा लग रहा है (और छोटा है): http://roderick.dk/blog/2010/10/12/introducing-pubsubjs-a-library-for-doing-publish- सदस्यता लें- इन-जावास्क्रिप्ट / – AnC

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