Estoy usando Tampermonkey para manipular y automatizar algunas páginas web. Para esto, agrego un detector de eventos al evento de "carga" de la ventana. Cuando defino el controlador de eventos como una función explícita, funciona sin problemas y como se esperaba, es decir, se llama a la función cada vez que se carga la página correspondiente.
window.addEventListener("load", run()); function run() { // do something }Sin embargo, cuando defino el controlador en línea de la siguiente manera
window.addEventListener("load", function (){ // do something });luego necesito actualizar/recargar la página varias veces antes de que se ejecute la función.
¿Cuál es la explicación para tener un comportamiento tan diferente? No habría esperado ninguna diferencia si defino la función "explícitamente" como en el primer ejemplo, o "en línea" como en el segundo. Como no lo he notado antes, ni siquiera sé si se trata de un problema de Tampermonkey o de Javascript.
window.addEventListener("load", run()); no ejecuta la función de run en la load sino de inmediato y el valor devuelto por la run se usa como devolución de llamada (que probablemente no esté undefined ). Este es un duplicado para que addEventListener llame a la función sin que yo siquiera se lo pida.
Acerca de:
luego necesito actualizar/recargar la página varias veces antes de que se ejecute la función.
Entonces probablemente registre el detector de eventos tarde (en un punto en el que posiblemente la página ya estaba cargada).
Ni siquiera sé si se trata de un problema de Tampermonkey o de Javascript.
No es ninguno de estos, es una suposición falsa de su parte que el sitio no puede estar ya cargado en el momento en que registra el evento de carga.
Quiere tener algo similar a la función ready de jQuery, cuya implementación de ejemplo sin jQuery se puede encontrar aquí $(document).ready equivalente sin jQuery .
Tl; Dr: pasa tu función, no la ejecutes. Deje que el controlador de escucha "load" lo ejecute en su lugar:
window.addEventListener("load", run); run() ejecuta su función y devuelve undefined por defecto: * window.addEventListener("load", undefined); // and executed. *
window.addEventListener("load", run()); // run() executes immediately function run() { // do something } Si run() devuelve otra función , entonces está bien
window.addEventListener("load", run()); // run() executes immediately // but returns a function in its place. function run() { return function() { // do something } } ya que ahora no está pasando undefined , sino una function real.