10

jQuery प्रदर्शन के बारे में एक और SO प्रश्न पढ़ना, मैंने उस बिंदु के बारे में सोचना शुरू किया जब यह अलग-अलग तत्वों के लिए बाध्यकारी होने के बजाय ईवेंट प्रतिनिधिमंडल का उपयोग करने लायक हो गया। मैं मुख्य रूप से jQuery के बारे में सोच रहा था, लेकिन मुझे लगता है कि यह सामान्य रूप से जावास्क्रिप्ट के लिए लागू है।घटना प्रतिनिधिमंडल के लिए सार्थक होने में कितने तत्व हैं?

  1. संचालकों तत्वों है कि अभी तक नहीं बनाया गया है/डोम में डाला पर काम करने की अनुमति देता है:

    घटना प्रतिनिधिमंडल दो मुख्य उद्देश्यों है।

  2. एक आम पूर्वज तत्व के बजाय

मेरा प्रश्न कई भाई तत्वों के लिए एक समारोह बाध्यकारी इन के दूसरे के बारे में है। सामान्य उत्तर शायद "यह सटीक स्थिति पर निर्भर करता है", लेकिन मुझे आश्चर्य है कि इसका परीक्षण करने के लिए अंगूठे का नियम या बेंचमार्किंग का एक तरीका है या नहीं।

तो, सवाल यह है: ईवेंट प्रतिनिधिमंडल के प्रदर्शन लाभ प्रदर्शन प्रदर्शन से अधिक होने से पहले आपको कितने तत्वों की आवश्यकता है?

+0

मुझे नहीं पता घटना प्रतिनिधिमंडल की प्रदर्शन लागत के बारे में जानें ... वे क्या हैं? ईवेंट वैसे भी बबल करें, और ईवेंट लक्ष्य ईवेंट ऑब्जेक्ट की इसी संपत्ति में हर समय संग्रहीत किया जाता है। –

+1

@Sime मुख्य बात यह है कि मैंने सोचा था कि हर बार एक घटना को निकाल दिया जाता है, प्रतिनिधि कॉल में चयनकर्ता को यह जांचने के लिए दौड़ना पड़ता है कि यह ईवेंट लक्ष्य से मेल खाता है या नहीं। अन्य हो सकते हैं ... – lonesomeday

+2

ध्यान दें कि जब आप प्रतिनिधिमंडल का उपयोग करते हैं, तो आप पृष्ठ के जीवनकाल पर बाध्यकारी हैंडलर की लागत प्रभावी ढंग से फैल रहे हैं। जब आप तत्वों को पहले ढूंढकर बाध्य करते हैं, तो आप पेज लोड समय पर अधिक काम जोड़ते हैं, जब उपयोगकर्ता देरी से सबसे संवेदनशील होते हैं। – Pointy

उत्तर

3

इस HTML संरचना मान लिया जाये:

<ul id="navUL"> 
    <li><a href="one.html">One</a></li> 
    <li><a href="two.html">Two</a></li> 
    <li><a href="three.html">Three</a></li> 
</ul> 

बस (मेरे लिए) स्पष्ट बातें करने के लिए .... jQuery डॉक्स (http://api.jquery.com/delegate/) के अनुसार, इस:

$("#navUL").delegate("a", "click", function(){ 
    // anchor clicked 
}); 

... इस के बराबर है:

$("#navUL").each(function(){ 
    $("a", this).live("click", function(){ 
     // anchor clicked 
    }); 
}); 

हालांकि, घटना प्रतिनिधिमंडल (मैं यह पता के रूप में) यह है:

$("#navUL").click(function(e) { 
    if (e.target.nodeName !== "A") { return false; } 
    // anchor clicked 
    // anchor is referenced by e.target 
}); 

तो तुम यूएल तत्व पर क्लिक करें घटना को पकड़ने, और फिर यह पता लगाने जो लंगर वास्तव में event.target संपत्ति के माध्यम से क्लिक किया गया था।

मैं विधि प्रतिनिधि() के बारे में पता नहीं है, लेकिन यह पिछले तकनीक हमेशा #navUL तत्व में प्रत्येक लंगर के लिए ईवेंट हैंडलर्स संलग्न की तुलना में तेजी से किया जाना चाहिए, ताकि जैसे:

$("#navUL a").click(function() { 
    // anchor clicked 
    // anchor is referenced by the this value 
}); 
+0

क्या आपको अपने प्रतिनिधिमंडल में 'e.stopPropagation();' की आवश्यकता नहीं है क्योंकि आप इसे उदाहरण जानते हैं? –

+0

एचएम, क्यों? उपयोगकर्ता #navUL तत्व के अंदर कहीं क्लिक करता है। क्लिक इवेंट #navUL तत्व को प्रसारित करता है (चूंकि ए या एल तत्वों से जुड़े कोई क्लिक हैंडलर नहीं हैं)। #navUL क्लिक हैंडलर के अंदर, मैं जांचता हूं कि एक एंकर क्लिक किया गया था या नहीं। यदि नहीं, तो मैं सिर्फ घटना को मारता हूं (झूठी वापसी के माध्यम से;)। यदि हां, तो मैं जो करता हूं वह करता हूं (एंकर के साथ)। मैं एंकर के डिफ़ॉल्ट व्यवहार को रोकना चाहता हूं, लेकिन मुझे नहीं लगता कि मैं क्लिक ईवेंट को डीओएम पेड़ को बुलबुला करने से क्यों रोकना चाहता हूं (मेरे पास पूर्वजों के तत्वों पर सेट कोई भी क्लिक हैंडलर नहीं है)। –

+0

हाँ, आप सही हैं। –

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