No render? No problem. Como esperar el render de un nodo en el DOM.
En mi actual rol debo realizar experimentación sobre las aplicaciones existentes, lo cual requiere que pueda tener el control de ejecutar javascript arbitrariamente código dentro de ciertos placements bajo ciertas condiciones. En ciertas situaciones, el script se debe ejecutar solo cuando ciertos elementos han sido renderizados.
Cómo puedo esperar por un elemento?
Implementación de un waiter
Estos son los requerimientos/necesidades del helper:
Poder revisar cada cierto tiempo si en el DOM existe el nodo que se requiere, con un
selector.Una vez validemos que este nodo existe, se ejecutará el código.
Una vez que el nodo ha sido encontrado, el ciclo de chequeo debe detenerse y terminarse.
Un tiempo máximo de espera es necesario, como un
timeoutque defina el final de la frecuencia de chequeo.
Código
Esta función necesita:
- Un
stringque indique elquerySelectorque buscamos. - Un
integerdel valor máximo de tiempo de espera por el nodo. (El tiempo máximo a esperar por el nodo, en milisegundos). - Un
integerdel valor de la frecuencia de revisión al nodo (cada N milisegundos se revisará si el elemento existe). - Una
functionque contenga el código que queremos ejecutar cuando el nodo sea encontrado. (Como un callback).
function waitForElement(
querySelector,
timeOutInMilliseconds,
sleepInMillis,
callBack,
) {
const t0 = performance.now();
const myInterval = setInterval(detectElements, sleepInMillis);
function detectElements() {
const t1 = performance.now();
if ((t1 - t0) <= timeOutInMilliseconds) {
const elements = document.querySelectorAll(querySelector);
if (elements.length > 0) {
clearInterval(myInterval);
callBack(elements);
}
} else {
clearInterval(myInterval);
}
}
}
Descripción
waitForElement(querySelector: String, timeOutInMilliseconds: Number, sleepInMillis: Number, callback: Function)
Toma el querySelector y busca si el elemento existe en el DOM cada sleepInMillis milisegundos hasta que expire el timeOutInMilliseconds, una vez que se ha alcanzado el elemento (si se ha alcanzado), se ejecuta la función de callback.
Ejemplo:
waitForElement('.element-classname', 3000, 200, function(){
console.log('Element exists! Run this code.')
});
Beneficios de uso
- Esta función será útil solo en contextos de experimentación o de ejecución post render de código.