Estoy trabajando en una extensión en Chrome, y me pregunto: ¿cuál es la mejor manera de saber cuándo un elemento surge? Usando JavaScript simple, con un intervalo que verifica hasta que exista un elemento, ¿o jQuery tiene alguna manera fácil de hacer esto?
237
MutationObserver
>DOM Mutation Events
>setTimeout
.setTimeout
es compatible, simple de implementar, simple de mantener y tiene una sobrecarga insignificante.setTimeout
+jQuery
es menos que ideal en mi opinión por dos razones: 1.) jQuery bloat 2.) estás consultando innecesariamente manualmente el DOM en busca de elementos, los eventos superan esa velocidad fácilmente, 3.) siempre será más lento que cualquier nativo implementación. Si necesita hacer algo basado en la presencia de un elemento de manera razonablemente rápida, especialmente si su objetivo es una experiencia fluida del usuario, es inferior.Respuestas:
DOMNodeInserted
se está desaprobando, junto con otros eventos de mutación DOM, debido a problemas de rendimiento: el enfoque recomendado es usar un MutationObserver para ver el DOM. Sin embargo, solo es compatible con los navegadores más nuevos, por lo que debe recurrirDOMNodeInserted
cuandoMutationObserver
no esté disponible.fuente
if (mutation.addedNodes.length)
yaif (mutation.addedNodes)
que aún sería verdadero incluso si se trata de una matriz vacía. (2) No puede hacerlomutation.addedNodes.forEach()
porque AddedNodes es una lista de nodos y no puede iterar a través de una lista de nodos con forEach. Para una solución a esto, vea toddmotto.com/ditch-the-array-foreach-call-nodelist-hackEstaba teniendo este mismo problema, así que seguí adelante y escribí un complemento para ello.
$(selector).waitUntilExists(function);
Código:
fuente
window.setInterval
). No sé si laMutationObserver
respuesta también funciona por votación ...;
al comienzo de la función (;(function ($, window) {
)?Aquí hay una función básica de JavaScript para esperar la visualización de un elemento.
Parámetros:
selector
: Esta función busca el elemento $ {selector}time
: Esta función verifica si este elemento existe cada $ {time} milisegundos.Como ejemplo, configura
selector="#div1"
ytime=5000
buscará la etiqueta HTMLid="div1"
cada 5000 milisegundos.fuente
querySelector
? developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorPuede escuchar
DOMNodeInserted
oDOMSubtreeModified
eventos que se activan cada vez que se agrega un nuevo elemento al DOM.También existe el complemento LiveQuery jQuery que detectaría cuándo se crea un nuevo elemento:
fuente
Usé este enfoque para esperar a que aparezca un elemento para poder ejecutar las otras funciones después de eso.
Digamos que la
doTheRestOfTheStuff(parameters)
función solo debe invocarse después de que el elemento con IDthe_Element_ID
aparece o termina de cargar, podemos usar,fuente
Tu puedes hacer
Tenga en cuenta que esto solo funcionará si el elemento está presente en el DOM cuando se lo solicite al servidor. Si el elemento se agrega dinámicamente a través de JavaScript, no funcionará y es posible que deba mirar las otras respuestas.
fuente
.ready()
función funciona para casi cualquier cosa (si no cualquier cosa), no solodocument
. Simplemente no funcionará con elementos creados dinámicamente, incluso en.live()
.$(document).ready()
, no el elemento que cree que se aplicará también. Así es como funciona este oyente especial . EjemploCreo que todavía no hay ninguna respuesta aquí con un ejemplo de trabajo fácil y legible. Use MutationObserver
interface
para detectar cambios DOM, como este:fuente
Simplemente agregue el selector que desee. Una vez que se encuentra el elemento, puede tener acceso a él en la función de devolución de llamada.
fuente
Para un enfoque simple usando jQuery, he encontrado que esto funciona bien:
Aquí simplemente verificamos cada 500 ms para ver si el elemento está cargado, cuando lo está, podemos usarlo.
Esto es especialmente útil para agregar controladores de clics a elementos que se han agregado dinámicamente al documento.
fuente
¿Qué tal la biblioteca insertionQuery ?
insertionQuery utiliza devoluciones de llamada de animación CSS adjuntas a los selectores especificados para ejecutar una devolución de llamada cuando se crea un elemento. Este método permite ejecutar devoluciones de llamada cada vez que se crea un elemento, no solo la primera vez.
De github:
fuente
Aquí hay una función que actúa como una envoltura delgada alrededor de MutationObserver. El único requisito es que el navegador sea compatible con MutationObserver; no hay dependencia en JQuery. Ejecute el fragmento a continuación para ver un ejemplo de trabajo.
fuente
Aquí hay una solución de devolución de promesas en Javascript vainilla (sin devoluciones de llamada desordenadas). Por defecto verifica cada 200ms.
fuente
Aquí hay una función Javascript pura que le permite esperar cualquier cosa. Establezca el intervalo más largo para tomar menos recursos de CPU.
Para llamar a esto, por ejemplo en jQuery, use algo como:
fuente
Una solución que devuelve ay
Promise
permite utilizar un tiempo de espera (IE 11+ compatible).Para un solo elemento (tipo Elemento):
Para múltiples elementos (escriba NodeList):
Ejemplos:
Funciona tanto para una lista de elementos como para un solo elemento.
fuente
element instanceof HTMLElement
? ¿Puede ser algo más quenull
oHTMLElement
?Element
lugar (fijo). Acabo de hacer la verificación porque quiero asegurarme de que la variableelement
tenga la propiedadinnerHTML
como dice la documentación de Element MDN . ¡Siéntase libre de eliminarlo si no le importa!Un ejemplo más limpio usando MutationObserver:
fuente
Esta es una solución simple para aquellos que están acostumbrados a las promesas y no quieren usar libs o temporizadores de terceros.
Lo he estado usando en mis proyectos por un tiempo
Para usarlo:
o con asíncrono / espera
fuente
async
/await
también. También podría obtener más rendimiento al hacerlomutations.addedNodes.find(node => node.matchesSelector("..."))
Si desea que deje de verse después de un tiempo (tiempo de espera), el siguiente jQuery funcionará. Terminará el tiempo después de 10 segundos. Necesitaba usar este código en lugar de JS puro porque necesitaba seleccionar una entrada por nombre y tenía problemas para implementar algunas de las otras soluciones.
fuente
Usualmente uso este fragmento para Tag Manager:
fuente
si tiene cambios de dom asíncronos, esta función verifica (con límite de tiempo en segundos) para los elementos DOM, no será pesado para el DOM y su Promesa basada :)
fuente