2009-08-02 17 views
6

क्या इंटरनेट एक्सप्लोरर में कोई घटना है, जिसे डीओएम बदलते समय निकाल दिया जाता है? उदाहरण के लिए:क्या कोई ऑन-डॉक्यूमेंट चेंज इवेंट है?

document.attachEvent("ondocumentchange", function() { 
    alert("you've just changed DOM!"); 
}); 

और जब मैं निष्पादित करें:

document.appendChild(document.createElement("img")); 

विंडो पाठ के साथ "तुम सिर्फ डोम बदल दिया है!" प्रकट होता है।

मैं जावास्क्रिप्ट का उपयोग कर आईई 6 में "उन्नत" सीएसएस चयनकर्ताओं (उदा। +,>, [Attr]) का अनुकरण करने का प्रयास करता हूं। हालांकि गतिशील सामग्री के साथ ठीक से काम करने के लिए, दस्तावेज़ में प्रत्येक बदलाव के बाद उन्हें फिर से गणना करनी होगी।

उत्तर

9

ब्रूट-बल "समाधान":

(function (previousInnerHTML) { 
    return function() { 
     if (document.body.innerHTML !== previousInnerHTML) { 
      alert("you've just (at max 33ms ago) changed DOM"); 
     } 
     setTimout(arguments.callee, 33); 
    }; 
})(document.body.innerHTML)(); 
+2

बदसूरत, लेकिन आईई 6 में काम करता है। –

+0

आप एक सेटटाइमआउट का उपयोग क्यों करेंगे? इस मामले में एक सेट अंतराल अधिक समझ में नहीं होगा? –

+0

आईई 11 के अनुसार, इस पुराने पोस्ट में किसी और को ठोकर खाएं, हमारे पास उत्परिवर्तन ऑब्सर्वर https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver# का विकल्प है –

3

आप डोम उत्परिवर्तन घटनाओं को देखना चाहते हैं - http://en.wikipedia.org/wiki/DOM_Events देखें, और उत्परिवर्तन घटनाओं पर अनुभाग तक नीचे स्क्रॉल करें। केवल समस्या यह है कि इन घटनाओं के लिए समर्थन सुंदर स्केची है, इसलिए उनका उपयोग करके सावधान रहें। विशेष रूप से, आईई या ओपेरा में समर्थन की कमी। फ़ायरफ़ॉक्स, सफारी और क्रोम एकमात्र ऐसा प्रतीत होता है।

कुछ की तरह:

document.addEventListener("DOMSubtreeModified", function() { 
    alert("you've just changed DOM!"); 
}); 

घटनाओं आप addEventListener, नहीं attachEvent उपयोग करने की आवश्यकता के इन प्रकार के लिए http://www.quirksmode.org/dom/events/index.html के अनुसार। घटना जाहिर तौर पर बुलबुले, तो यह ठीक होना चाहिए।

+2

"[...] बिल्कुल IE में समर्थन की कमी [...]" - यही समस्या है - मैं IE की वजह से इस घटना की जरूरत है। –

+0

डर है मुझे नहीं लगता कि ऐसा करने का एक तरीका है, कम से कम डोम पेड़ पर मैन्युअल रूप से बिना किसी रिकॉर्ड्स के। क्या आप किसी विशिष्ट बच्चे नोड में परिवर्तन को सीमित नहीं कर सकते हैं? – Kazar

+0

उत्परिवर्तन घटनाओं को बहिष्कृत कर दिया गया है, उत्परिवर्तन ऑब्सर्वर आईई 11 के रूप में उपलब्ध है https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver# –

1

मेरे सिर के ऊपर बंद, इस पराक्रम काम:

document.body.attachEvent('onpropertychange', function(event) { 
    if (event.propertyName !== 'innerHTML') return; 
    alert("you've just changed DOM!"); 
}); 

यह IE के स्वामित्व [onPropertyChange घटना] पर निर्भर करता है (http://msdn.microsoft.com/en-us/library/ms536956(VS.85).aspx) - के बाद से दस्तावेज़ के innerHTML बदल जाएगा जब भी एक नोड डाला जाता है लेकिन।:

  1. यह गुण के कुछ प्रकार के साथ काम नहीं हो सकता है। मुझे लगता है innerHTML एक "गेटर" की तरह कार्य करेगा में है कि यह केवल जब retri पुनर्गणना मिल चाहते हैं eved।

  2. यह भी लेने हैं एक बहुत गलत परिणामों की की - अन्य बातों के बहुत सारे innerHTML उस नोड प्रविष्टि के साथ कोई लेना देना नहीं होता है को संशोधित करेगा। आप दस्तावेज़-व्यापी के बजाए किसी विशेष तत्व को सुनकर इसे कम कर सकते हैं।

+1

दुर्भाग्यवश, "'आंतरिक टेक्स्ट' या 'आंतरिक HTML' को बदलना दस्तावेज़ तत्वों का कहना है कि बाल तत्व __onpropertychange__ ईवेंट को पैरेंट तत्व के लिए आग नहीं पहुंचाएंगे। और यहां तक ​​कि जब प्रत्येक डीओएम तत्व से फ़ंक्शन संलग्न होता है, तब भी यह नहीं कहा जाता है कि मैं डोम मैनिपुलेशन फ़ंक्शंस का उपयोग करता हूं - केवल अगर आंतरिक HTML सीधे बदला जाता है। –

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