2009-08-02 18 views
6

Gibt es im Internet Explorer ein Ereignis, das ausgelöst wird, wenn DOM geändert wird? Zum Beispiel:Gibt es ein onDocumentChange-Ereignis?

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

Und wenn ich ausführen:

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

Fenster mit dem Text "Sie haben sich verändert nur DOM!" erscheint.

Ich versuche, "erweiterte" CSS-Selektoren (z. B. +,>, [attr]) in IE6 mit Javascript zu emulieren. Um jedoch mit dynamischem Inhalt richtig zu arbeiten, müssten sie nach jeder Änderung im Dokument neu berechnet werden.

Antwort

9

Brute-Force "Lösung":

(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

Hässlich, aber funktioniert in IE6. –

+0

Warum würden Sie ein setTimeout verwenden? Wäre in diesem Fall kein setInterval sinnvoller? –

+0

Sollte jemand über diesen alten Beitrag stolpern, haben wir ab IE 11 die Option MutationObserver https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver# –

3

Sie möchten nach dom-Mutationsereignissen suchen - siehe http://en.wikipedia.org/wiki/DOM_Events und scrollen Sie nach unten zum Abschnitt über Mutationsereignisse. Das einzige Problem ist, dass die Unterstützung für diese Ereignisse ziemlich skizzenhaft ist, also seien Sie vorsichtig mit ihnen. Bemerkenswerterweise mangelnde Unterstützung in IE oder Opera. Firefox, Safari und Chrome scheinen die einzigen zu sein.

Etwas wie:

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

Nach http://www.quirksmode.org/dom/events/index.html für diese Art von Ereignissen Sie addEventListener verwenden müssen, nicht attachEvent. Das Ereignis scheint Blasen, also sollte das in Ordnung sein.

+2

"[...] Mangel an Unterstützung überhaupt in IE [...]" - das ist das Problem - ich dieses Ereignis muß wegen IE. –

+0

Ich fürchte, ich denke nicht, dass es einen Weg gibt, dies zu tun, zumindest nicht ohne manuell über den DOM-Baum zu rekursieren. Können Sie die Änderungen für einen bestimmten untergeordneten Knoten nicht eingrenzen? – Kazar

+0

Mutationsereignisse sind veraltet, mutationObserver ist ab IE 11 verfügbar https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver# –

1

Aus der Spitze von meinem Kopf, diese Macht Arbeit:

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

Dies beruht auf proprietärer [onPropertyChange Ereignis] IE (http://msdn.microsoft.com/en-us/library/ms536956(VS.85).aspx) - seit innerHTML ist das Dokument würde sich ändern, wenn ein Knoten eingefügt wird aber.:

  1. es ist vielleicht nicht mit bestimmten Arten von Eigenschaften arbeiten. ich stelle mir vor innerHTML wie ein „Getter“ funktionieren würde, dass es nur neu berechnet bekommen würde, wenn retri Eved.

  2. Es wäre auch viele von Fehlalarmen holen - viele anderen Dingen würden die innerHTML ändern, die nichts mit dem Knoten Einfügen zu tun haben würde. Sie können dies abschwächen, indem Sie auf ein bestimmtes Element statt auf das gesamte Dokument warten.

+1

Leider "Ändern des' innerText' oder 'innerHTML' von Untergeordnete Elemente führen nicht dazu, dass das Ereignis __onpropertychange__ für das übergeordnete Element ausgelöst wird ", heißt es in der Dokumentation. Und selbst wenn Funktion an jedes DOM-Element angehängt ist, wird es nicht aufgerufen, wenn ich DOM-Manipulationsfunktionen verwende - nur wenn innerHTML direkt geändert wird. –