tiempo que pagina obtiene objeto funcion forma eventos elementos ejemplos ejecutar dinámicamente dinámica despues creados creado como cargar carga asociar asincrona antes acceso javascript jquery jquery-plugins jquery-3

javascript - pagina - ¿Por qué mi evento/función ''cargar'' no se ejecuta después de cambiar a jQuery 3?



ejecutar funcion javascript antes de cargar la pagina (1)

Como he actualizado de jQuery 1.x / jQuery 2.x a jQuery 3.x , mi código existente ya no se ejecutará correctamente. Todo funciona bien, pero el detector de eventos de load ya no se activa o solo a veces:

$(function() { $(window).on("load", function() { // this line will never/occasionally be executed console.log("window is loaded!"); }); });


El problema puede ocurrir al usar / cambiar a jQuery 3 . Esto se debe a que todos los ready states en el nuevo jQuery 3 ahora son completamente asynchron . Esto significa que no hay un orden dado para que se ejecute su código.

Debido a esto, podría suceder que esa load se active antes de que se haya ejecutado su ready state . Cuando su función de ready ahora finalmente se activa, su escucha de load es demasiado tarde y no se ejecutará.

Uso de jQuery:

Para cambiar este comportamiento, simplemente elimine el ready state alrededor de la inicialización de su escucha de eventos de load . No hay necesidad de encapsular esto con una función ready . Puede inicializarlos sin.

// $(function() { $(window).on("load", function() { // this line will now be executed again console.log("window is loaded!"); }); // });

Si necesita o desea registrar ambos eventos, puede registrar el evento de load usted mismo y decidir dentro del ready state qué hacer a continuación.

// track the loading state by yourself var windowLoaded = false; $(window).on("load", function() { windowLoaded = true; }); $(function() { function afterLoad() { console.log("loaded"); } // decide inside your ready state what to do if( !windowLoaded ) { $(window).on("load", afterLoad); } else { afterLoad(); } });

Complementos jQuery:

Otro caso sería jQuery plugins, que también usa el evento load . Por ejemplo:

(function($, window) { $.fn.myPlugin = function() { $(window).on("load", start); function start() { console.log("plugin initialized and window loaded"); } }; })(jQuery, window);

Si un desarrollador / usuario ahora envuelve la inicialización del complemento en un ready state el problema podría volver a ocurrir, tal como se explicó anteriormente:

$(function() { $("#element").myPlugin(); });

Una solución sería rastrear el evento de load en su complemento por su cuenta, para romper el ready state .

(function($, window) { // track the loading state beside the plugin initialization var windowLoaded = false; $(window).on("load", function() { windowLoaded = true; }); $.fn.myPlugin = function() { // decide inside your plugin how to start if( !windowLoaded ) { $(window).on("load", start); } else { start(); } function start() { console.log("plugin initialized and window loaded"); } }; })(jQuery, window);

Conclusión:

Incluso cuando este problema no le ocurra, en sus pruebas, debe cambiar ese código inmediatamente, cuando use jQuery 3 , porque otros usuarios / navegadores diferentes pueden encontrarse con este problema. Otros pueden tener el problema, porque es asynchron , nunca se podría saber cuándo / si se ejecuta su código ...