2012-06-20 11 views
9

¿Es posible que una extensión de Chrome escuche la apariencia de un elemento aún por crear?Escuchar para crear un elemento y desencadenar un evento cuando aparece en la página en la extensión de Chrome

Supongamos que el usuario hace clic en un botón y el evento click crea un elemento <div id='myDiv'>My Div</div> y lo agrega a la página/DOM. ¿Es posible configurar un oyente que activará automáticamente un evento cuando aparezca ese elemento?

¿O tengo que recurrir a sondear la página y verificar este elemento cada X cantidad de milisegundos?

jQuery y otras bibliotecas no son una opción para mí por cierto.

+0

¿Por qué no hacer un seguimiento de los clics del botón? ¿O se cargará por otros medios? – TheZ

+0

En realidad se está creando con una devolución de llamada AJAX, pero acabo de expresarlo de la manera más directa por el bien del ejemplo. Entonces tengo que escuchar la creación/apariencia del elemento. –

+0

¿Duplicado? http://stackoverflow.com/questions/7434685/event-when-element-added-to-page ... En cualquier caso, parece que la solución más elegante ahora está en desuso (Eventos de mutación DOM), pero hay una solución hacky publicada aquí: http://stackoverflow.com/questions/6997826/alternative-to-domnodeinserted – Cecchi

Respuesta

12

El nuevo DOM4 MutationObserver puede hacerlo. No creo que sea ampliamente compatible todavía, pero afortunadamente para ti, es compatible con Chrome, como WebKitMutationObserver.

Modificado de la página de ayuda ligada, esta escucha de mutaciones en todas partes en la página:

var observer = new WebKitMutationObserver(function(mutations) { 
    mutations.forEach(function(mutation) { 
     for (var i = 0; i < mutation.addedNodes.length; i++) { 
      if(mutation.addedNodes[i].id == "myDiv") { 
       // target node added, respond now... 
      } 
     } 
    }); 
}); 
observer.observe(document, { subtree: true }); 

Si usted puede reducir su escucha en observer.observe a un elemento más específico que document, que daría una ganancia de rendimiento .

+0

¿Hay una implementación heredada? – Zlatko

+0

@zladuric Quizás esté interesado en [¿Hay un escucha de cambio de jQuery DOM?] (Http://stackoverflow.com/questions/2844565/is-there-a-jquery-dom-change-listener/) – apsillers

+0

Gracias, pero no puedo usar bibliotecas externas. setInterval tendrá que permanecer. – Zlatko

2

Puede usar arrive.js, envuelve el Mutation Observers api. Uso:

document.arrive(".test-elem", function() { 
    // 'this' refers to the newly created element 
    var newElem = this; 
}); 
Cuestiones relacionadas