2009-08-02 15 views
6

¿Hay algún evento en Internet Explorer que se active siempre que se modifique DOM? Por ejemplo:¿Hay algún evento onDocumentChange?

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

Y cuando ejecuto:

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

ventana con el texto "que ha acaba de cambiar DOM!" aparece.

Intento emular los selectores de CSS "avanzados" (por ejemplo, +,>, [attr]) en IE6 utilizando Javascript. Sin embargo, para funcionar correctamente con contenido dinámico, tendrían que volverse a calcular después de cada cambio en el documento.

Respuesta

9

de fuerza bruta "solución":

(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

feo, pero funciona en IE6. –

+0

¿Por qué usarías un setTimeout? En este caso, ¿un setInterval no tendría más sentido? –

+0

Si alguien más se topa con esta publicación anterior, desde IE 11 tenemos la opción de mutationObserver https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver# –

3

Quiere ver los eventos de mutación dom - vea http://en.wikipedia.org/wiki/DOM_Events, y desplácese hacia abajo a la sección sobre eventos de mutación. El único problema es que el soporte para estos eventos es bastante incompleto, así que ten cuidado al usarlos. En particular, la falta de soporte en IE o Opera. Firefox, Safari y Chrome parecen ser los únicos.

Algo así como:

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

Según http://www.quirksmode.org/dom/events/index.html para este tipo de eventos que necesite utilizar addEventListener, no attachEvent. El evento aparentemente burbujea, por lo que debería estar bien.

+2

"[...] la falta de apoyo en absoluto en IE [...]" - ese es el problema - Necesito este evento debido a IE. –

+0

Miedo, no creo que haya una manera de hacerlo, al menos no sin recurrir manualmente al árbol DOM. ¿No puedes restringir los cambios a un nodo hijo específico? – Kazar

+0

Los eventos de mutación han quedado en desuso, mutationObserver está disponible a partir de IE 11 https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver# –

1

De la parte superior de mi cabeza, esta fuerza trabajo:

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

Esto se basa en [evento onPropertyChange] propiedad de IE (http://msdn.microsoft.com/en-us/library/ms536956(VS.85).aspx) - puesto de innerHTML el documento iba a cambiar cada vez que se inserta un nodo Pero.:

  1. puede que no funcione con ciertos tipos de propiedades. imagino innerHTML funcionaría como un "captador", ya que sólo se obtendría vuelve a calcular cuando Retri eved.

  2. También podría recoger una gran cantidad de falsos positivos - un montón de otras cosas modificarían la innerHTML que no tienen nada que ver con la inserción de nodos. Podría mitigar esto escuchando en un elemento particular, en lugar de en todo el documento.

+1

Lamentablemente, "Cambiar el' innerText' o 'innerHTML' de los elementos secundarios no provocarán que el evento __onpropertychange__ se active para el elemento primario ", dice la documentación. E incluso cuando la función está asociada a cada elemento DOM, no se llama si utilizo las funciones de manipulación DOM, solo si innerHTML se cambia directamente. –

Cuestiones relacionadas