Quiero que se ejecute una función de mi elección cuando se agrega un elemento DOM a la página. Esto está en el contexto de una extensión del navegador, por lo que la página web se ejecuta independientemente de mí y no puedo modificar su fuente. ¿Cuáles son mis opciones aquí?
Supongo que, en teoría, podría usar setInterval()
para buscar continuamente la presencia del elemento y realizar mi acción si el elemento está allí, pero necesito un mejor enfoque.
Respuestas:
Dado que los eventos de mutación quedaron en desuso en 2012 y no tiene control sobre los elementos insertados porque los agrega el código de otra persona, su única opción es verificarlos continuamente.
Una vez que se llama a esta función, se ejecutará cada 100 milisegundos, que es 1/10 (una décima) de segundo. A menos que necesite observación de elementos en tiempo real, debería ser suficiente.
fuente
MutationObserver()
: davidwalsh.name/mutationobserver-apiEvent.ADDED_TO_STAGE
?La respuesta real es "usar observadores de mutación" (como se describe en esta pregunta: Determinar si un elemento HTML se ha agregado al DOM dinámicamente ), sin embargo, el soporte (específicamente en IE) es limitado ( http://caniuse.com/mutationobserver ) .
Entonces, la respuesta ACTUAL real es "Usar observadores de mutación ... eventualmente. Pero ve con la respuesta de Jose Faeti por ahora" :)
fuente
Entre la degradación de los eventos de mutación. y la aparición de
MutationObserver
, una manera eficiente de ser notificado cuando se agrega un elemento específico al DOM es explotar los eventos de animación CSS3 .Para citar la publicación del blog:
fuente
animationstart
, jsbin.com/netuquralu/1/edit .Puede usar el
livequery
complemento para jQuery. Puede proporcionar una expresión de selector como:Cada vez que
removeItemButton
se agrega un botón de una clase, aparece un mensaje en una barra de estado.En términos de eficiencia, es posible que desee evitar esto, pero en cualquier caso, puede aprovechar el complemento en lugar de crear sus propios controladores de eventos.
Respuesta revisada
La respuesta anterior solo pretendía detectar que un elemento se ha agregado al DOM a través del complemento.
Sin embargo, lo más probable es que un
jQuery.on()
enfoque sea más apropiado, por ejemplo:Si tiene contenido dinámico que debería responder a los clics, por ejemplo, es mejor vincular eventos a un contenedor principal mediante
jQuery.on
.fuente
ETA 24 abr 17 Quería simplificar esto un poco con algunos
async
/await
magia, ya que lo hace mucho más sucinto:Usando el mismo prometido-observable:
Su función de llamada puede ser tan simple como:
Si desea agregar un tiempo de espera, puede usar un
Promise.race
patrón simple como se muestra aquí :Original
Puede hacer esto sin bibliotecas, pero tendría que usar algunas cosas de ES6, así que tenga en cuenta los problemas de compatibilidad (es decir, si su audiencia es principalmente amish, ludita o, peor aún, usuarios de IE8)
Primero, usaremos la API MutationObserver para construir un objeto observador. Envolveremos este objeto en una promesa, y
resolve()
cuando se active la devolución de llamada (h / t davidwalshblog) artículo del blog de david walsh sobre mutaciones :Entonces, crearemos un
generator function
. Si aún no los ha usado, se está perdiendo, pero una breve sinopsis es: se ejecuta como una función de sincronización, y cuando encuentra unyield <Promise>
expresión, espera sin bloqueos la promesa de ser cumplido (los generadores hacen más que esto, pero esto es lo que nos interesa aquí ).Una parte difícil de los generadores es que no "regresan" como una función normal. Entonces, usaremos una función auxiliar para poder usar el generador como una función regular. (de nuevo, h / t a dwb )
Luego, en cualquier momento antes de que ocurra la mutación DOM esperada, simplemente ejecute
runGenerator(getMutation)
.Ahora puede integrar mutaciones DOM en un flujo de control de estilo síncrono. ¿Qué tal eso?
fuente
Hay una prometedora biblioteca de JavaScript llamada Arrive que parece una excelente manera de comenzar a aprovechar los observadores de mutaciones una vez que el soporte del navegador se vuelve común.
https://github.com/uzairfarooq/arrive/
fuente
Echa un vistazo a este complemento que hace exactamente eso - jquery.initialize
Funciona exactamente como cada función, la diferencia es que toma el selector que ha ingresado y busca nuevos elementos agregados en el futuro que coincidan con este selector y los inicialice
Inicializar se ve así
Pero ahora si el nuevo elemento coincide
.some-element
aparece un selector de en la página, se inicializará instantáneamente.La forma en que se agrega un nuevo elemento no es importante, no necesita preocuparse por ninguna devolución de llamada, etc.
Entonces, si agrega un nuevo elemento como:
Se inicializará instantáneamente.
El complemento se basa en
MutationObserver
fuente
Una solución javascript pura (sin
jQuery
):fuente