2011-11-30 9 views
5

मैं प्रश्न के लिए इस परीक्षण कोड दिया है: http://jsfiddle.net/5phqm/1/क्यों jQuery का ट्रिगर हैडलर() इनलाइन घटनाओं को रोकता नहीं है?

जहां तक ​​मैं समझता हूँ, अगर jQuery के triggerHandler() डिफ़ॉल्ट ब्राउज़र व्यवहार से बचाता है, तो देशी जावास्क्रिप्ट ईवेंट के कारण नहीं किया जाएगा और संभाला (और उस में addEventListener() के लिए सच है मेरी कोड), लेकिन टैग की विशेषता onclick="" के माध्यम से जोड़ा गया इनलाइन ईवेंट वैसे भी ट्रिगर किया जाएगा! ऐसा क्यों होता है? क्या मैं ब्राउज़र में ट्रिगर करने वाली घटनाओं के बारे में कुछ गलत समझ रहा हूं?

+0

इसके लायक होने के लिए मैं हमेशा सीएसएस नियमों के व्यवहार के पैटर्न के रूप में इस बारे में सोचता हूं: इन-लाइन कोड 'हेड' में मिले कोड को ओवरराइड करता है जो बदले में बाहरी स्क्रिप्ट में पाए गए कोड को ओवरराइड करता है। आप बस 'RemoveAttr (' onclick ') 'हटा सकते हैं। –

+2

यह प्रत्यक्ष उत्तर नहीं है लेकिन jQuery वेबसाइट पर वे कहते हैं कि वे इनलाइन ईवेंट हैंडलर के साथ समस्याओं पर प्रयास नहीं करते हैं: http://docs.jquery.com/Won't_Fix#Inline_Event_Handlers। मुझे यह जानने में दिलचस्पी होगी कि आपका कोड ऐसा क्यों व्यवहार करता है, लेकिन मुझे नहीं लगता कि इसके लिए एक फिक्स होगा (यदि आपको यह एक बग मिलती है)। – pimvdb

उत्तर

2

यह पुष्टि की जा सकती है कि इनलाइन संचालकों क्योंकि यह explicitly coded है चलाए जा रहे हैं:

handle = ontype && cur[ ontype ]; 
if (handle && jQuery.acceptData(cur) && handle.apply(cur, data) === false) { 
    event.preventDefault(); 
} 

जहां ontype इस मामले "onclick" में है। तो यह तत्व की onclick संपत्ति प्राप्त कर रहा है और फिर इसे निष्पादित कर रहा है। कोड का यह टुकड़ा हमेशा .trigger/.triggerHandler पर ध्यान दिए बिना कहा जाता है।

मूल निवासी कार्यों तथापि, elem.click() की तरह, सिर्फ inside an if block क्रियान्वित कर रहे हैं:

if (!onlyHandlers && !event.isDefaultPrevented()) { 
    // ... 
    elem[ type ](); 

जहां onlyHandlers.trigger के लिए triggerHandle के लिए true और false है, और इसलिए triggerHandler जैसे निष्पादित नहीं करता है elem.click() (जबकि .trigger करता है)। इस प्रकार, मूल कार्रवाई को रोका जाता है।

तो इनलाइन हैंडलर और मूल कार्य अलग-अलग चीजें हैं और उन्हें अलग से संभाला जाता है। .triggerHandler द्वारा केवल मूल कार्यवाही रोक दी जाती है।

0

मुझे लगता है कि (लेकिन यह एक अनुमान, मैं jQuery स्रोत कोड पर एक संक्षिप्त देखो दे दी है और इस पूरी तरह से गलत हो सकता है) कि jQuery

$(elem).data("events"); 
की तरह कुछ फोन करके घटनाओं jQuery.trigger.event में तत्वों से जुड़ी को पुन: प्राप्त

और फिर निर्णय लेता है कि उन्हें आग/रोकना है या नहीं। इनलाइन घटनाओं को इस तरह से एकत्र नहीं किया जा सकता है और इसलिए उन्हें रोका नहीं जा सकता है।

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