2012-05-01 21 views
5

के लिए .on करने के लिए(), jQuery 1.7 के बाद से:उन्नयन एक पृष्ठ अनुप्रयोगों

$('someSelector').live('click', fn()); 

बन गया है, अनिवार्य रूप से:

$(document).on('click', 'someSelector', fn()); 

सभी लाइव ईवेंट नहीं कर रहे चयनकर्ता में तत्वों के लिए सीधे बाध्य नहीं है, लेकिन दस्तावेज़ के लिए प्रतिनिधि प्रतिनिधि।

यह, मुझे लगता है कि ऐसा है, जो भविष्य में 'someSelector' से मेल खाते हैं, इसलिए डोम में मौजूद नहीं हैं, इसलिए ईवेंट हैंडलर को बाध्य नहीं किया जा सकता है (प्रत्यक्ष या प्रतिनिधि बाध्यकारी के माध्यम से)।

एकल पृष्ठ अनुप्रयोगों के लिए जहां विशाल बहुमत, यदि सभी तत्व गतिशील रूप से लोड नहीं होते हैं, तो दस्तावेजों में बाध्यकारी सब कुछ के साथ प्रदर्शन के मुद्दे को संभालने के तरीके के बारे में दिशानिर्देश प्रकाशित किए गए हैं?

उदाहरण के लिए, ajax() के माध्यम से नई सामग्री लोड होने पर और आलसी .live() मानसिकता में लिखे गए कोड को अपडेट करने के लिए ईवेंट हैंडलर को फिर से पंजीकृत/पुनः पंजीकृत करने का सबसे अच्छा तरीका कवर करना?

+0

मैं आम तौर पर दस्तावेज़ या एक मूल कंटेनर से बांधता हूं जिसे हटाया नहीं जाता है।AJAX अनुरोधों के बाद घटनाओं को फिर से पंजीकृत करना एक विकल्प है, हालांकि इसे बनाए रखना मुश्किल हो सकता है। –

+0

@Chad मुझे आपकी शैली पसंद है। ऐसा करने के दौरान मैं "बूम" कहूंगा और फिर मेरे माउस को "माइक ड्रॉप" कहूंगा। – StuperUser

+1

लेकिन सभी गंभीरता में 'दस्तावेज़' के लिए बाध्यकारी के साथ कुछ भी "गलत" नहीं है जब तक कि यह ऐसी सामग्री न हो जो आपको लगता है कि यह कभी खत्म नहीं होने के बाद कभी वापस नहीं आएगा, दस्तावेज़ से जुड़ें। (वह '$ (दस्तावेज़) है।()' '' '$ (दस्तावेज) .बिंद()' स्पष्ट रूप से) – Chad

उत्तर

3

मुझे यकीन नहीं है कि "प्रकाशित दिशानिर्देश" हैं या नहीं।

मुझे लगता है कि इस दृष्टिकोण उसकी खूबियों है:

  • निकटतम तार्किक आम पूर्वज उस दस्तावेज़ से नहीं हटाए जाएंगे का पता लगाएं।

    उदाहरण: खींचने योग्य तालिका पंक्ति व्यवहार के लिए, यह मूल तालिका (या टैब) होगी।

  • वहां बाइंड घटनाएं। यह आपको एक ही चीज के अलग-अलग उदाहरणों को संदर्भ जांच की आवश्यकता के बिना अलग तरीके से व्यवहार करने की अनुमति देता है।

    उदाहरण: यदि पंक्ति-ड्रैगिंग अस्थायी रूप से आपके किसी एक टेबल पर अक्षम है, तो ईवेंट को संभालने वाली तालिका स्वाभाविक रूप से जानी जाएगी। document नहीं होगा।

  • यह कम से कम document द्वारा प्रबंधित की जाने वाली घटनाओं की संख्या बनाए रखेगा, इसलिए कोई घटना होने पर कई "यह वास्तव में आवश्यक" जांच नहीं होगी।

    उदाहरण: अगर वहाँ वर्तमान में खींचने योग्य पंक्तियों के साथ कोई तालिका है, वहाँ कोई ज़रूरत नहीं एक ईवेंट हैंडलर document स्तर पर भी आग (बस पता लगाने के लिए कि table.draggable tr वास्तव में घटना के स्रोत नहीं था और खारिज करता है यह तुरंत)।

  • यदि सामान्य पूर्वजों को अक्सर हटा दिया जाता है, तो आप तय कर सकते हैं कि घटना निर्माण करने वाले ईवेंट हैंडलर को फिर से बाध्यकारी करना या पदानुक्रम में उन्हें कुछ स्तरों को बाध्य करना बेहतर होगा।

मैं कंटेनर निर्माण पर कंटेनर घटनाओं को फिर से बांध दूंगा, लेकिन यह व्यक्तिगत प्राथमिकता है, मुझे लगता है। री-बाइंडिंग काफी आसान है, सभी के बाद:

// once, beforehand 
var draggableTableRowBehavior = { 
    dragstart: function() { /* ... */ }, 
    dragstop: function() { /* ... */ } 
    /* ... */ 
}; 

//in Ajax success: 
$table.on(draggableTableRowBehavior, 'tr');