2013-10-26 9 views
5

मुझे पता है कि इसे किसी भी तरीके से संभाला जा सकता है, लेकिन अभी तक, यह मुझे एक वास्तविक कठिन समय दे रहा है। मैं एक स्क्रिप्ट लिख रहा हूं और कुछ विशेष कार्यों को आग लगाना चाहता हूं जब एक डोम हेरफेर पूरा हो जाता है। मैं किसी अन्य स्क्रिप्ट को संशोधित/जोड़/हटा नहीं सकता (क्योंकि इसे कुछ ढांचे का उपयोग करके पृष्ठ में इंजेक्शन दिया जा सकता है)। पृष्ठ सामग्री लोड/संशोधित करने के लिए AJAX अनुरोध (jQuery में लागू नहीं किया गया है) का उपयोग कर रहा है। अब जब मैं प्रत्येक डीओएम संशोधन पूरा कर लेता हूं तो मैं एक घटना ट्रिगर करना चाहता हूं। मेरा वर्तमान दृष्टिकोण प्रत्येक DOMSubtreeModified ईवेंट पर फ़ंक्शन को आग लगाना है। इसप्रत्येक डोम परिवर्तन पर "जावास्क्रिप्ट" फायरिंग "पूर्ण"

$(document).bind('DOMSubtreeModified', doSomeStuff); 

की तरह कुछ लेकिन इस दृष्टिकोण का दोष यह है, का कहना है कि ajax लोड एक कॉल में 10 तत्वों, तो प्रत्येक तत्व के लिए doSomeStuff निकाल रहा है। 10 वीं तत्व लोड होने के बाद यह केवल फायरिंग तक ही सीमित हो सकता है? $ (दस्तावेज़) .ready() घटना को रीसेट करने जैसा कुछ? इसलिए $ (दस्तावेज़) .ready() को हर बार तैयार किया जाता है जब डीओएम तैयार होता है (AJAX सामग्री लोड करने के बाद)

+0

DOMSubtreeModified को हटा दिया गया है http://stackoverflow.com/questions/6659662/why-is-the-domsubtreemodified-event-deprecated-in-dom-level-3 और इसके बजाय http: // अपडेट का उपयोग करने के लिए अनुशंसाएं हैं .html5rocks.com/2012/02/उत्परिवर्तन-पर्यवेक्षकों के साथ पता-डोम-परिवर्तन – Bernhard

+0

@ बर्नार्ड डॉमसुब्रीरी अभी भी क्रोम के साथ काम करता है, फिर भी म्यूटेशन पर्यवेक्षक मुझे बता सकते हैं कि दस्तावेज़ फिर से तैयार है या नहीं? – whizzzkid

उत्तर

1

jQuery में, एक विधि ajaxComplete है, जो प्रत्येक समाप्त AJAX कॉल के बाद दिए गए फ़ंक्शन को कॉल करती है। अधिक here देखें।

मैं jQuery का उपयोग करने का सुझाव दूंगा या (यदि यह कोई विकल्प नहीं है) यह देखने के लिए कि यह कैसे किया जाता है, इस फ़ंक्शन के स्रोत कोड का विश्लेषण करें।

+0

मैं इसे लागू करने में असफल रहा। क्या यह केवल jQuery AJAX अनुरोधों को सुनता है? ... क्योंकि चिंता का पृष्ठ jQuery के AJAX फ़ंक्शन का उपयोग नहीं कर रहा है। – whizzzkid

+0

प्रलेखन कहता है 'अब, किसी भी jQuery विधि का उपयोग करके अजाक्स अनुरोध करें' तो हाँ, मुझे लगता है कि यह केवल jQuery अनुरोधों के साथ काम करता है। स्रोतों पर गहराई से देखने में मदद मिल सकती है :) –

+0

:(कोई सार्वभौमिक समाधान? – whizzzkid

2

उत्परिवर्तन पर्यवेक्षक के साथ आप परिवर्तनों पर सुन सकते हैं और यदि ईवेंट को निकाल दिया गया है तो दस्तावेज़ बदल दिया गया था।

MutationObserver = window.MutationObserver || window.WebKitMutationObserver; 

var observer = new MutationObserver(function(mutations, observer) { 
    // Add the actions to be done here if a changes on DOM happened 
    console.log(mutations, observer); 

}); 

// Register the element root you want to look for changes 
observer.observe(document, { 
    subtree: true, 
    attributes: true 
}); 
+0

पूरी तरह से मान्य है, लेकिन मैं नहीं चाहता कि यह हर डोम परिवर्तन पर आग लग जाए। डोम परिवर्तन पर केवल फायरिंग के बारे में कैसे? ... AJAX की तरह कुछ jQuery में पूर्ण लेकिन jQuery के बिना ... सभी सामग्री लोडिंग को सुन रहा है ... – whizzzkid

+0

@whizzkid सभी गुंबद परिवर्तनों के लिए कोई घटना पूरी नहीं है। यह answear केवल तभी देखता है जब एक ही परिवर्तन पूरा हो गया/हुआ। इसलिए यदि आपको अज्ञात संख्या में परिवर्तनों को पूरा करने के लिए श्रोता की आवश्यकता है तो आपको काउंटर या कुछ और बनाना होगा और पर्यवेक्षक कॉलबैक के अंदर 0 तक काउंटर को कम करना होगा। यदि यह 0 है तो आप जानते हैं कि कोई भी परिवर्तन पूरा हो गया है। लेकिन यह एक अच्छी बात नहीं है और बेहतर कॉलबैक उन्मुख वास्तुकला अधिक उचित है। – Bernhard

+0

$ (दस्तावेज़) की तरह कुछ हो सकता है .ready() फिर से तैयार होने पर फिर से आग लगने के लिए पुन: प्रारंभ किया जा सकता है? – whizzzkid

0

मैं जानता हूँ कि मैं पार्टी के लिए देर से एक सा है, लेकिन यह लग रहा है कि आप अपने doSomeStuff समारोह Debounce कर सकते हैं की तरह। यदि आप अंडरस्कोर.जेएस पर निर्भरता पेश करने का विरोध नहीं कर रहे हैं, तो इसका अच्छा debounce फ़ंक्शन है।

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