2009-12-25 13 views
14

घटना बाइंडिंग - jQuery बनाम जावास्क्रिप्ट

$("#element").click(function() { alert("test"); }); 

और

<div id="element" onclick="alert('test');"></div> 

वहाँ प्रदर्शन, कार्यक्षमता या कुछ और में कोई अंतर है का उपयोग कर के बीच क्या अंतर है? क्या मुझे jQuery मार्ग का उपयोग करना चाहिए, जब मैं बस onclick विशेषता का उपयोग कर सकता हूं?

उत्तर

11

Why Inline JavaScript Code Is Such A Bad Thing

और

Unobtrusive JavaScript

यह भी हमेशा बेहतर जावास्क्रिप्ट घटनाओं बंधन के लिए एक रूपरेखा का उपयोग करने के बाद से वहाँ क्रॉस-ब्राउज़र बातें हैं अगर आप डॉन अपना ख्याल रखना करने की जरूरत है ' टी (संलग्नक ..)।

+14

कुछ कहना है कि "जावास्क्रिप्ट घटनाओं को बाध्य करने के लिए एक ढांचे का उपयोग करना हमेशा बेहतर होता है" - यदि आप सामान्य प्रयोजन लाइब्रेरी का उपयोग कर रहे हैं जैसे कि jQuery के लिए तो आप अपने उपयोगकर्ताओं को लोड चीजों को डाउनलोड करने के लिए मजबूर कर रहे हैं उन्हें जरूरत नहीं है। इसके अलावा, बाध्यकारी घटनाएं बस इतना कठिन नहीं है। और मैं नहीं कहूंगा कि "अविभाज्य" तरीके का उपयोग करना हमेशा बेहतर होता है। –

+0

अला पर भी [व्यवहारिक पृथक्करण] [1] लेख देखें। [1]: http://www.alistapart.com/articles/behavioralseparation/ –

18

jQuery के click (और साथ ही अन्य पुस्तकालयों 'घटना कपोल-कल्पना से ज्यादातर के रूप में) का उपयोग करता है मानक DOM L2 addEventListener या MSHTML मालिकाना (और बाद में ओपेरा की तरह, कुछ अन्य ब्राउज़र द्वारा की नकल की) attachEvent, जब addEventListener उपलब्ध नहीं है।

यदि न तो addEventListener, attachEvent मौजूद नहीं हैं (जैसा कि कुछ प्राचीन ब्राउज़रों के मामले में है), jQuery कुछ भी नहीं (1.4a2 के रूप में) करता है।

onclick="..." आपके दूसरे उदाहरण से intrinsic event attribute कहा जाता है, और HTML 4.01 में परिभाषित किया गया है। ऐसी घटना विशेषता का मान किसी ईवेंट हैंडलर का फ़ंक्शन बॉडी बन जाता है। जब घटना होती है, तो इस हैंडलर फ़ंक्शन को पहले तर्क के रूप में event के साथ बुलाया जाता है; फ़ंक्शन स्कोप चेन भी usually augmented है जिसमें तत्व के कुछ पूर्वजों और तत्व शामिल हैं।

आंतरिक घटना विशेषता के लाभों व्यापक ब्राउज़र समर्थन और यकीनन बेहतर प्रदर्शन है। मुझे घटना विशेषताओं के परीक्षण देखने को याद है जिसके परिणामस्वरूप addEventListener/attachEvent के माध्यम से शुरू की गई तुलना में बहुत कम मेमोरी खपत होती है। मैं इस समय उन परीक्षणों को नहीं ढूंढ सकता।

attachEvent से परहेज करके, आप स्वाभाविक रूप से आईई में मेमोरी लीक से बचते हैं। अधिकांश लोकप्रिय जावास्क्रिप्ट पुस्तकालय वास्तव में अपने ईवेंट अबास्ट्रक्शन में परिपत्र संदर्भ बनाते हैं, और फिर आईई में पेज अनलोड पर क्लीन अप करने के लिए मजबूर होते हैं। जाहिर है, जब आप attachEvent पर भरोसा करते हैं तो ईवेंट की स्थिति से बचने पर ये समस्याएं गायब हो जाती हैं।

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

मैं को सलाह देता हूं कि ईवेंट विशेषताओं से बचें, जब तक कि बिल्कुल जरूरी न हो।

+2

आप इन प्रथाओं को भी जोड़ सकते हैं, यानी document.getElementById ("theElement") का उपयोग करें। Onclick = theunction; एक विंडो में। एक अलग जावास्क्रिप्ट फ़ाइल में लोड करें। फिर आपको यह जांचने की ज़रूरत नहीं है कि addEventListener या attachEvent समर्थित है या नहीं और आपकी जावास्क्रिप्ट को एक अविभाज्य तरीके से बांध दिया गया है। या यह किसी कारण से वास्तव में एक बुरा अभ्यास है? –

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