मैं jfriend00 के उत्तर में कुछ टिप्पणी और प्रतिवाद जोड़ना चाहूंगा। (मेरी आंत भावना के आधार पर ज्यादातर मेरी राय)
नहीं - आपको सभी प्रत्यायित ईवेंट हैंडलर को दस्तावेज़ ऑब्जेक्ट में बाँधना नहीं चाहिए। यह संभवतः सबसे खराब प्रदर्शन वाला परिदृश्य है जिसे आप बना सकते हैं।
सबसे पहले, इवेंट डेलिगेशन हमेशा आपके कोड को तेज नहीं बनाता है। कुछ मामलों में, यह फायदेमंद है और कुछ मामलों में नहीं। आपको इवेंट डेलिगेशन का उपयोग तब करना चाहिए जब आपको वास्तव में इवेंट डेलिगेशन की आवश्यकता हो और जब आप इससे लाभान्वित हों। अन्यथा, आपको इवेंट हैंडलर को सीधे उन ऑब्जेक्ट्स पर बाँध देना चाहिए जहाँ इवेंट होता है क्योंकि यह आम तौर पर अधिक कुशल होगा।
हालांकि यह सच है कि प्रदर्शन थोड़ा बेहतर हो सकता है यदि आप केवल एक ही तत्व के लिए पंजीकरण और ईवेंट करने जा रहे हैं, मेरा मानना है कि यह शिष्टता लाभ के खिलाफ वजन नहीं करता है जो प्रतिनिधिमंडल लाता है। मेरा यह भी मानना है कि ब्राउजर इसे (और अधिक कुशलता से) संभाल रहे हैं, हालांकि मेरे पास इसका कोई प्रमाण नहीं है। मेरी राय में, इवेंट डेलिगेशन जाने का रास्ता है!
दूसरा, आपको दस्तावेज़ स्तर पर सभी प्रत्यायोजित घटनाओं को नहीं बांधना चाहिए। यह वास्तव में ऐसा क्यों है। लिव () को अपदस्थ किया गया था क्योंकि यह बहुत अक्षम है जब आपके पास इस तरह से बहुत सारी घटनाएं होती हैं। प्रत्यायोजित घटना से निपटने के लिए यह सबसे अधिक कुशल है जो उन्हें निकटतम माता-पिता से बांधने के लिए अधिक कुशल है जो गतिशील नहीं है।
मैं इस पर सहमत हूं। यदि आप 100% सुनिश्चित हैं कि एक घटना केवल एक कंटेनर के अंदर ही होगी, तो इस कंटेनर में इस घटना को बांधने का कोई मतलब नहीं है, लेकिन मैं फिर भी सीधे ट्रिगरिंग तत्व के लिए बाध्यकारी घटनाओं के खिलाफ बहस करूंगा।
तीसरा, सभी घटनाएँ काम नहीं करती हैं या सभी समस्याओं को प्रतिनिधिमंडल के साथ हल किया जा सकता है। उदाहरण के लिए, यदि आप एक इनपुट कंट्रोल पर प्रमुख घटनाओं को इंटरसेप्ट करना चाहते हैं और अमान्य कुंजियों को इनपुट कंट्रोल में दर्ज करने से रोकते हैं, तो आप ऐसा नहीं कर सकते हैं कि प्रत्यायोजित ईवेंट हैंडलिंग के साथ, क्योंकि जब तक यह इवेंट हैंडलर हैंडलर तक पहुँच जाता है, तब तक यह पहले ही हो चुका होता है। इनपुट नियंत्रण द्वारा संसाधित किया गया है और उस व्यवहार को प्रभावित करने के लिए बहुत देर हो चुकी है।
यह बिल्कुल सही नहीं है। कृपया इस कोड को देखें: https://codepen.io/pwkip/pen/jObGmjq
document.addEventListener('keypress', (e) => {
e.preventDefault();
});
यह दिखाता है कि आप दस्तावेज़ पर कीपर इवेंट को पंजीकृत करके किसी उपयोगकर्ता को टाइप करने से कैसे रोक सकते हैं।
ऐसे समय में जब इवेंट डेलिगेशन आवश्यक या लाभप्रद है:
जब आप जिन वस्तुओं पर घटनाओं को कैप्चर कर रहे हैं, वे गतिशील रूप से बनाई गई / हटा दी जाती हैं और आप हर बार जब आप एक नया बनाते हैं, तो स्पष्ट रूप से रीबाइंड इवेंट हैंडलर्स के बिना उन पर ईवेंट कैप्चर करना चाहते हैं। जब आपके पास बहुत सी वस्तुएं होती हैं जो सभी सटीक एक ही घटना हैंडलर चाहते हैं (जहां बहुत से कम से कम सैकड़ों हैं)। इस मामले में, सैकड़ों या अधिक प्रत्यक्ष इवेंट हैंडलर के बजाय एक प्रतिनिधि ईवेंट हैंडलर को बाइंड करने के लिए सेटअप समय पर यह अधिक कुशल हो सकता है। ध्यान दें, प्रत्यायोजित ईवेंट हैंडलिंग हमेशा प्रत्यक्ष ईवेंट हैंडलर की तुलना में रन-टाइम पर कम कुशल होती है।
मैं इस उद्धरण के साथ https://ehsangazar.com/optimizing-javascript-event-listeners-for-performance-e28406ad406c से उत्तर देना चाहूंगा
Event delegation promotes binding as few DOM event handlers as possible, since each event handler requires memory. For example, let’s say that we have an HTML unordered list we want to bind event handlers to. Instead of binding a click event handler for each list item (which may be hundreds for all we know), we bind one click handler to the parent unordered list itself.
इसके अलावा, performance cost of event delegation google
घटना के प्रतिनिधिमंडल के पक्ष में अधिक परिणाम के लिए googling ।
जब आप दस्तावेज़ में किसी भी तत्व पर होने वाली घटनाओं (अपने दस्तावेज़ में उच्च स्तर पर) को पकड़ने की कोशिश कर रहे हैं। जब आपका डिज़ाइन स्पष्ट रूप से ईवेंट बुबलिंग और स्टॉपप्रोपैजेशन () का उपयोग करके आपके पेज की कुछ समस्या या सुविधा का समाधान करता है। इसे थोड़ा और समझने के लिए, किसी को यह समझने की आवश्यकता है कि jQuery प्रतिनिधि इवेंट हैंडलर कैसे काम करते हैं। जब आप कुछ इस तरह कहते हैं:
$ ("# myParent")। ('पर क्लिक करें', 'बटन.एक्शनबटन', myFn); यह #myParent ऑब्जेक्ट पर एक सामान्य jQuery इवेंट हैंडलर स्थापित करता है। जब एक क्लिक ईवेंट इस प्रत्यायोजित ईवेंट हैंडलर तक पहुँच जाता है, तो jQuery को इस ऑब्जेक्ट से जुड़े डेलीगेटेड ईवेंट हैंडलर की सूची से गुजरना होता है और यह देखना होता है कि ईवेंट के लिए मूल तत्व डेलिगेट इवेंट हैंडलर में सेलेक्टर्स में से किसी से मेल खाते हैं या नहीं।
क्योंकि चयनकर्ता काफी हद तक शामिल हो सकते हैं, इसका मतलब है कि jQuery को प्रत्येक चयनकर्ता को पार्स करना है और फिर मूल इवेंट लक्ष्य की विशेषताओं से तुलना करके यह देखना है कि क्या यह प्रत्येक चयनकर्ता से मेल खाता है। यह सस्ता ऑपरेशन नहीं है। यदि उनमें से केवल एक ही है, तो यह कोई बड़ी बात नहीं है, लेकिन यदि आप अपने सभी चयनकर्ताओं को दस्तावेज़ ऑब्जेक्ट पर रखते हैं और हर एक बुदबुदाती हुई घटना की तुलना करने के लिए सैकड़ों चयनकर्ता थे, तो यह गंभीर रूप से घटना से निपटने के प्रदर्शन को शुरू कर सकता है।
इस कारण से, आप अपने प्रत्यायोजित ईवेंट हैंडलर सेट करना चाहते हैं, इसलिए एक डेलिगेटेड ईवेंट हैंडलर व्यावहारिक रूप से लक्ष्य ऑब्जेक्ट के करीब है। इसका मतलब यह है कि प्रत्येक प्रतिनिधि ईवेंट हैंडलर के माध्यम से कम ईवेंट्स का बुलबुला फूटेगा, इस प्रकार प्रदर्शन में सुधार होगा। दस्तावेज़ ऑब्जेक्ट पर सभी प्रत्यायोजित घटनाओं को डालना सबसे खराब संभव प्रदर्शन है क्योंकि सभी बुदबुदाती घटनाओं को सभी प्रत्यायित इवेंट हैंडलर के माध्यम से जाना पड़ता है और सभी संभावित प्रत्यायित ईवेंट चयनकर्ताओं के खिलाफ मूल्यांकन करना होता है। यह वास्तव में ऐसा क्यों है। लिव () को पदावनत किया जाता है क्योंकि यह वही है। लिलिव () ने किया और यह बहुत अक्षम साबित हुआ।
यह कहाँ प्रलेखित है? अगर यह सच है, तो jQuery बहुत ही अक्षम तरीके से प्रतिनिधिमंडल को संभाल रहा है, और फिर मेरे काउंटर-तर्क केवल वेनिला जेएस पर लागू होने चाहिए।
फिर भी: मैं इस दावे का समर्थन करने वाला एक आधिकारिक स्रोत खोजना चाहूंगा।
:: संपादित ::
लगता है जैसे jQuery वास्तव में बहुत ही अक्षम तरीके से घटना बुदबुदा रहा है (क्योंकि वे IE8 का समर्थन करते हैं)
https://api.jquery.com/on/#event-performance
इसलिए मेरे अधिकांश तर्क केवल वेनिला जेएस और आधुनिक ब्राउज़रों के लिए सही हैं।