Saltar al contenido

Detectar si se está ejecutando alguna función de JavaScript

Buscamos en internet y así brindarte la respuesta a tu problema, si tienes alguna pregunta deja tu inquietud y te respondemos con mucho gusto, porque estamos para ayudarte.

Solución:

JavaScript en los navegadores web es de un solo subproceso (salvo el uso de trabajadores web), por lo que si su código JavaScript se está ejecutando, por definición, no se está ejecutando ningún otro código JavaScript.*

Para tratar de asegurarse de que su secuencia de comandos se ejecute después de que se haya descargado y evaluado todo el resto de JavaScript en la página y después de que se haya realizado todo el procesamiento, algunas sugerencias:

  • Coloque la etiqueta del script para su código al final del archivo.
  • Utilizar el defer y async attributes en la etiqueta (los navegadores que no los admitan los ignorarán, pero el objetivo es hacer que el suyo sea el último tanto como podamos).
  • enganchar el windowload evento a través de una conexión de estilo DOM2 (por ejemplo, addEventListener en navegadores compatibles con estándares, o attachEvent en versiones anteriores de IE).
  • En el load evento, programe su código para que se ejecute después de un setTimeout con un retraso de 0 ms (en realidad no será cero, será un poco más largo).

Entonces el script etiqueta:


…y yourfile.js:

(function() 
    if (window.addEventListener) 
        window.addEventListener("load", loadHandler, false);
    
    else if (window.attachEvent) 
        window.attachEvent("onload", loadHandler);
    
    else 
        window.onload = loadHandler; // Or you may want to leave this off and just not support REALLY old browsers
    

    function loadHandler() 
        setTimeout(doMyStuff, 0);
    

    function doMyStuff() 
        // Your stuff here. All images in the original markup are guaranteed
        // to have been loaded (or failed) by the `load` event, and you know
        // that other handlers for the `load` event have now been fired since
        // we yielded back from our `load` handler
    
)();

Eso no significa que otro código no se haya programado para ejecutarse más tarde (a través de setTimeoutpor ejemplo, tal como lo hicimos anteriormente pero con un tiempo de espera más largo).

Entonces, hay algunas cosas que puede hacer para tratar de ser el último, pero no creo que haya ninguna forma de garantizarlo sin tener el control total de la página y los scripts que se ejecutan en ella (lo tomo de la pregunta que no ‘t).


(* Hay algunos casos extremos en los que el subproceso se puede suspender en un lugar y luego permitir que otro código se ejecute en otro lugar [for instance, when an ajax call completes while an alert message is being shown, some browsers fire the ajax handler even though another function is waiting on the alert to be dismissed]pero son casos extremos y todavía solo se está haciendo una cosa a la vez).

Crear un cargador

Hola, como javaScript puede ejecutar funciones o llamadas asincrónicas, también necesitaba una forma de saber cuándo la página estaba en un estado estable. Para ello, utilizo un pequeño cargador en cada una de mis funciones:

    var loading_var = 0;

    // some functions in your code that may not execute at the same time
    // or have to wait an async call
    function f1() 
      loading_var++;
      // code to be exectuted
      onready();
    

    function f2() 
      loading_var++;
      // code to be exectuted
      onready();
    

    // loader function
    function onready() 
      loading_var--;
      if(loading_var == 0) 
        // Means all functions have finished executing !
        
    

A menudo lo combino con una función freezeClic para evitar que los usuarios interactúen con la página cuando hay un script que todavía está esperando una respuesta ajax/async (y, opcionalmente, mostrar un ícono o pantalla de precarga).

No existe una forma definitiva de hacer esto porque realmente no puede saber qué es lo último que otros scripts han programado para ejecutarse. Tendrás que decidir a qué quieres apuntar.

  1. Puede intentar ejecutar su secuencia de comandos después de cualquier otra cosa que pueda estar ejecutándose cuando se carga el DOM.
  2. Puede intentar ejecutar su secuencia de comandos después de cualquier otra cosa que pueda estar ejecutándose cuando la página esté completamente cargada (incluidas las imágenes).

No existe una forma confiable entre navegadores para saber cuál de estos eventos están usando los scripts en la página.

En cualquier caso, engancha el evento apropiado y luego usa un setTimeout() para intentar ejecutar su secuencia de comandos después de cualquier otra cosa que esté viendo esos eventos.

Entonces, por ejemplo, si decidiera esperar hasta que se cargara toda la página (incluidas las imágenes) y quisiera intentar que su secuencia de comandos se ejecutara después de cualquier otra cosa que estuviera esperando el mismo evento, haría algo como esto:

window.addEventListener("load", function() 
    setTimeout(function() 
        // put your code here
    , 1);
, false);

tendrías que usar attachEvent() para versiones anteriores de IE.

Al usar este método, no tiene que preocuparse por dónde se cargan sus secuencias de comandos en la página en relación con otras secuencias de comandos en la página, ya que esto programa su secuencia de comandos para que se ejecute en un momento determinado después de un evento en particular.

Ten en cuenta dar recomendación a este tutorial si si solucionó tu problema.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 5)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *