2009-08-02 8 views
6

Czy istnieje zdarzenie w programie Internet Explorer, który jest zwolniony, gdy DOM ulega zmianie? Na przykład:Czy istnieje zdarzenie onDocumentChange?

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

I kiedy wykonać:

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

okno z tekstem "który właśnie zmienił DOM!" pojawia się.

staram się naśladować "zaawansowanych" selektorów CSS (np +,>, [atr]) w IE6 przy użyciu JavaScript. Jednak aby poprawnie działać z treścią dynamiczną, trzeba je ponownie obliczyć po każdej zmianie dokumentu.

Odpowiedz

9

brute-force "rozwiązanie":

(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

Brzydki, ale działa w IE6. –

+0

Dlaczego chcesz użyć setTimeout? Czy w takim przypadku setInterval nie ma większego sensu? –

+0

Jeśli ktoś inny natknie się na ten stary post, to od IE 11 mamy opcję mutationObserver https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver# –

3

Chcesz spojrzeć w Domu wydarzeń mutacji - patrz http://en.wikipedia.org/wiki/DOM_Events i przewiń w dół do sekcji dotyczącej zdarzeń mutacji. Jedynym problemem jest to, że obsługa tych wydarzeń jest dość pobieżna, więc należy ich ostrożnie używać. W szczególności brak wsparcia w ogóle w IE lub Operze. Firefox, Safari i Chrome wydają się być jedynymi.

Coś jak:

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

Według http://www.quirksmode.org/dom/events/index.html dla tego rodzaju zdarzeń, które trzeba użyć addEventListener, nie attachEvent. Impreza najwyraźniej pęcherzyki, więc powinno być dobrze.

+2

"[...] brak wsparcia w ogóle w IE [...]" - w tym tkwi problem - muszę to wydarzenie ze względu na IE. –

+0

boi nie sądzę, istnieje sposób to zrobić wtedy, przynajmniej nie bez recursing na drzewie DOM ręcznie. Czy nie można zawęzić zmian do określonego węzła podrzędnego? – Kazar

+0

Zdarzenia mutacji zostały wycofane, mutationObserver jest dostępny od IE 11 https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver# –

1

Off szczycie mojej głowie, to potęga praca:

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

ta opiera się na zastrzeżonych [imprezy onPropertyChange] IE (http://msdn.microsoft.com/en-us/library/ms536956(VS.85).aspx) - ponieważ zmieni dokumentu innerHTML gdy węzeł jest włożona Ale.:

  1. to może nie działać z niektórymi typami właściwości. Wyobrażam innerHTML będzie funkcjonować jak „getter” w tym, że to get przeliczone tylko gdy retri eved.

  2. Byłoby również odebrać dużo fałszywych alarmów - wiele innych rzeczy byłoby zmodyfikować innerHTML że miałoby nic wspólnego z wstawiania węzła. Można to złagodzić, słuchając konkretnego elementu, a nie całego dokumentu.

+1

Niestety, "Zmiana' innerText' lub 'innerHTML' of elementy potomne nie spowodują zdarzenia __onpropertychange__ dla elementu nadrzędnego ", mówi dokumentacja. I nawet gdy funkcja jest dołączony do każdego elementu DOM, nie nazywa, jeśli mogę użyć funkcji manipulacji DOM - tylko jeśli innerHTML jest zmieniana bezpośrednio. –