2011-12-19 7 views

Respuesta

4

Sé que esta es una pregunta antigua, que ya tiene una respuesta, pero dado que las cosas han cambiado, pensé que agregaría una respuesta actualizada para las personas que aterricen en esta página en busca de una respuesta.

DOM Mutation Events han quedado en desuso. De acuerdo con MDN (con respecto DOM Mutation Events):

DEPRECATED
Esta característica se ha quitado de la web. Aunque algunos navegadores aún pueden soportarlo, está en proceso de descarte. No lo use en proyectos antiguos o nuevos. Las páginas o aplicaciones web que lo usan pueden romperse en cualquier momento.

uno debe utilizar el nuevo MutationObserver API, que también es más eficiente.
(La biblioteca mutation-summary proporciona ahora un inteface útil a este nuevo API.) Uso

Ejemplo:

/* Create an observer instance */ 
var observer = new MutationObserver(function(mutations) { 
    mutations.forEach(function(mutation) { 
     console.log(mutation.type); 
    }); 
}); 

/* Config info for the observer */ 
var config = { 
    "childList": true, 
    "subtree": true 
}; 

/* Observe the body and its (descendants) for "childList" changes */ 
observer.observe(document.body, config); 

/* Stop the observer, when it is not required any more */ 
observer.disconnect(); 
+0

¡Eso no es bueno! Odio que StackOverflow esté tan desactualizado con la tecnología web. Marqué esto como la respuesta aceptada. – mikemaccana

1

Para la opción más sencilla, es posible que desee examinar LiveQuery que es efectivamente el "oyente DOM" que buscas. Sin embargo, debe usarse con precaución, ya que tiene el potencial de ser bastante pesado, en cuanto a rendimiento.

Si prefiere 'enrollar el suyo' - con .on() debería funcionar para todos los elementos actuales y futuros, pero los elementos agregados deberían coincidir con el selector. Por ejemplo, si conecta un evento a todas las clases de .myClass y luego inyectó un nuevo elemento de la misma clase al DOM, el evento debería dispararse. Efectivamente, los roll up de .on() bind/live/delegate de versiones anteriores de jQuery, los últimos dos funcionan contra elementos DOM actuales y futuros.

+0

Gracias @SpaceBison. ¿Qué implicaría mi propio uso de on()?Me complace utilizar livequery si es necesario, pero me gustaría evitar los complementos si es posible. – mikemaccana

+1

Si desea tener * eventos personalizados * que se activen cuando se agrega un artículo, siga la respuesta de Luiz Fernando: si SOLO desea utilizar los * eventos incorporados *, pero los enciende cuando se crea un elemento, usted Necesitará un selector que coincida con los elementos que ya existen y que se crearán, y los cableará usando * on() * - siempre que los nuevos elementos coincidan con el selector, el evento se activará para cualquier elemento añadido así como también -existente. – SpaceBison

0

Como complemento de la respuesta de @ SpaceBison, puede crear sus propios eventos cuando cree estos elementos. Por ejemplo:

function create_element() { 
    // Create an element 
    $('body').append("<p>Testing..</p>") 
    // Trigger 
    $('body').trigger('elementCreated'); 
} 
function monitor_elements() { 
    $("body").on("elementCreated", function(event){ 
    alert('One more'); 
    }); 
} 

$(document).ready(function(){ 

    monitor_elements(); 

    for (var i=0; i < 3; i++) { 
     create_element(); 
    } 

}); 

ejemplo vivo: http://jsfiddle.net/9NsAh/

Pero, por supuesto, es sólo es útil cuando se crea sus propios elementos.

2

Como mencioné, no estoy creando mis propios elementos, por lo que disparar un evento cuando creo el elemento no es una opción.

La mejor solución para esto es Mutation Observer API, para la cual el Mutation Summary proporciona una interfaz amigable.

+0

Esto es increíblemente útil para las extensiones de Chrome. ¡Muchas gracias! –

+1

Para aquellos que quieren un código rápido para ponerse en marcha: http://stackoverflow.com/questions/19150450/why-dont-mutationobserver-codes-run-on-chrome-30 ** Combina la pregunta y la respuesta aceptada para el código de trabajo . ** –

Cuestiones relacionadas