Quiero ejecutar una función cuando se agregan algunos div o entradas al html. es posible?
Por ejemplo, se agrega una entrada de texto, luego se debe llamar a la función.
Quiero ejecutar una función cuando se agregan algunos div o entradas al html. es posible?
Por ejemplo, se agrega una entrada de texto, luego se debe llamar a la función.
Respuestas:
Actualización de 2015, la nueva
MutationObserver
es compatible con los navegadores modernos:Chrome 18+, Firefox 14+, IE 11+, Safari 6+
Si necesita apoyar a los más antiguos, puede intentar recurrir a otros enfoques como los mencionados en esta respuesta de 5 (!) Años a continuación. Habrá dragones. Disfruta :)
¿Alguien más está cambiando el documento? Porque si tiene control total sobre los cambios, solo necesita crear su propia
domChanged
API, con una función o evento personalizado, y activarla / llamarla en cualquier lugar donde modifique cosas.El DOM Nivel-2 tiene tipos de eventos de mutación , pero la versión anterior de IE no lo admite. Tenga en cuenta que los eventos de mutación están en desuso en la especificación de Eventos DOM3 y tienen una penalización de rendimiento .
Puede intentar emular un evento de mutación
onpropertychange
en IE (y recurrir al enfoque de fuerza bruta si no hay ninguno disponible).Para una domChange completa, un intervalo puede ser una sobremoción. Imagine que necesita almacenar el estado actual de todo el documento y examinar cada propiedad de cada elemento para que sea la misma.
Tal vez si solo le interesan los elementos y su orden (como mencionó en su pregunta),
getElementsByTagName("*")
puede funcionar. Esto se activará automáticamente si agrega un elemento, elimina un elemento, reemplaza elementos o cambia la estructura del documento.Escribí una prueba de concepto:
Uso:
Esto funciona en IE 5.5+, FF 2+, Chrome, Safari 3+ y Opera 9.6+
fuente
Este es el enfoque final hasta ahora, con el código más pequeño:
IE9 +, FF, Webkit:
fuente
mutations, observer
parámetros a la función de devolución de llamada para obtener más control.Recientemente escribí un complemento que hace exactamente eso: jquery.initialize
Lo usas de la misma manera que la
.each
funciónLa diferencia
.each
es: toma su selector, en este caso,.some-element
y espera nuevos elementos con este selector en el futuro, si se agrega dicho elemento, también se inicializará.En nuestro caso, la función de inicialización simplemente cambia el color del elemento a azul. Entonces, si agregaremos un nuevo elemento (no importa si con ajax o incluso F12 inspector o algo así) como:
El complemento lo iniciará al instante. Además, el complemento se asegura de que un elemento se inicialice solo una vez. Entonces, si agrega un elemento, luego
.detach()
lo agrega desde el cuerpo y luego lo agrega nuevamente, no se inicializará nuevamente.El complemento se basa en
MutationObserver
: funcionará en IE9 y 10 con dependencias como se detalla en la página Léame .fuente
o simplemente puede crear su propio evento , que se ejecuta en todas partes
Ejemplo completo http://jsfiddle.net/hbmaam/Mq7NX/
fuente
Este es un ejemplo usando MutationObserver de Mozilla adaptado de esta publicación de blog
Chrome 18+, Firefox 14+, IE 11+, Safari 6+
fuente
Use la interfaz MutationObserver como se muestra en el blog de Gabriele Romanato
Chrome 18+, Firefox 14+, IE 11+, Safari 6+
fuente
¿Qué tal extender un jquery para esto?
Jquery 1.9+ ha creado soporte para esto (he oído que no se ha probado).
fuente