Есть ли событие onDocumentChange? - PullRequest
6 голосов
/ 02 августа 2009

Есть ли какое-либо событие в Internet Explorer, которое запускается при изменении DOM? Например:

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

И когда я выполню:

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

Окно с текстом "Вы только что изменили DOM!" появляется.

Я пытаюсь эмулировать «продвинутые» селекторы CSS (например, +,>, [attr]) в IE6, используя Javascript. Однако для правильной работы с динамическим контентом их придется пересчитывать после каждого изменения в документе.

Ответы [ 3 ]

9 голосов
/ 03 августа 2009

"грубое" решение ":

(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)();
3 голосов
/ 02 августа 2009

Вы хотите посмотреть на события мутации dom - см. http://en.wikipedia.org/wiki/DOM_Events, и прокрутите вниз до раздела о событиях мутации. Единственная проблема заключается в том, что поддержка этих событий довольно поверхностна, поэтому будьте осторожны при их использовании. Примечательно отсутствие поддержки вообще в IE или Opera. Firefox, Safari и Chrome кажутся единственными.

Что-то вроде:

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

Согласно http://www.quirksmode.org/dom/events/index.html для такого рода событий вам нужно использовать addEventListener, а не attachEvent. Событие явно пузырится, так что должно быть все в порядке.

1 голос
/ 03 августа 2009

С макушки головы, это может работать:

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 будет функционировать как «получатель» в том смысле, что он будет пересчитан только при получении.

  2. Это также поднимет много ложных срабатываний - многие другие вещи изменят innerHTML, который не будет иметь никакого отношения к вставке узла. Вы могли бы смягчить это, слушая определенный элемент, а не весь документ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...