2012-01-09 4 views
12

Я знаю, это может показаться очень странным, но мне нужно знать, есть ли какой-либо активный/запущенный javascript на странице.Проверьте, работает ли какая-либо функция JavaScript

Я нахожусь в ситуации, когда мне нужно запустить код javascript/jquery после того, как все на странице будет показано, и все остальные скрипты закончены.

Можно ли это обнаружить?

EDIT:

Спасибо всем за ответы. К сожалению, я не смог найти решение, потому что у меня нет полного контроля над тем, что происходит на странице.

Даже, я смог разместить свой javascript в конце страницы, я думаю, что это не будет решением снова. Причина в том, что когда страница выполняет рендеринг функции, она вызывает другие функции и вызывает другие и т. Д. В результате некоторые данные неверны, поэтому мне нужно запустить свой код, чтобы исправить его.

Я использую SetTimeout с 2-х секунд, чтобы убедиться, что мой код будет выполнен последним, но это некрасиво ...

Итак, спасибо всем, но это больше проблема с системой, а не в JS.

+0

Какой браузер работает? – Boomer

+0

@Boomer Мне нужно сделать этот кросс-браузер. – gotqn

+0

Это может помочь: http://stackoverflow.com/questions/3283576/how-to-trace-javascript-events-stack-trace –

ответ

12

JavaScript на веб-браузерах однопоточный (за исключением использования web workers), так что если ваш код JavaScript работает, по определению, ни один другой код JavaScript не работает. *

Чтобы попытаться гарантировать, что ваш сценарий происходит после того, как все другие JavaScript на странице были загружены и оценены, и после всего рендеринга произошли некоторые предложения:

  • Поместите тег сценария для своего кода в самом конце файла.
  • Используйте атрибуты defer and async на теге (они будут игнорироваться браузерами, которые их не поддерживают, но цель состоит в том, чтобы сделать ваш последним столько, сколько мы можем).
  • Захватите событие windowload через соединение типа DOM2 (например, addEventListener в браузерах со стандартными стандартами, или attachEvent на старых версиях IE).
  • В мероприятии load планируйте свой код для запуска после setTimeout с задержкой 0 мс (он не будет действительно равен нулю, он будет немного длиннее).

Итак, script тег:

<script async defer src="yourfile.js"></script> 

... и 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 
    } 
})(); 

Это вовсе не означает, что другой код не будет запланирован на себя работать позже (например, через setTimeout, как и мы, но с более длинным таймаутом).

Итак, есть некоторые вещи, которые вы можете сделать, чтобы попытаться быть последними, но я не верю, что есть какой-либо способ гарантировать это, не имея полного контроля над страницей и скриптами, запущенными на ней (я беру ее из вопрос, который у вас нет).


(* Есть некоторые крайние случаи, когда поток может быть приостановлены в одном месте, а затем позволяет другой код работать в другом месте [например, когда завершает Ajax вызова в то время как alert сообщения показываются, некоторые браузеры запускают обработчик ajax, хотя другая функция ожидает alert, чтобы уволить], но они являются крайними случаями, и одновременно происходит только одна вещь.)

2

Нет никакого определенного способа сделайте это, потому что вы не можете действительно знать, что самое последнее, что другие сценарии планировали запустить. Вам нужно будет решить, на что вы хотите нацелиться.

  1. Вы можете попробовать запустить скрипт после всего, что может быть запущено при загрузке DOM.
  2. Вы можете попробовать запустить свой скрипт после всего, что может быть запущено, когда страница полностью загружена (включая изображения).

Нет надежного кросс-браузерного способа узнать, какие из этих событий используются сценарии на странице.

В любом случае вы подключаете соответствующее событие, а затем используете setTimeout(), чтобы попытаться запустить скрипт после всего, что отслеживает эти события.

Так, например, если вы решили дождаться загрузки всей страницы (включая изображения) и хотите попробовать запустить ваш скрипт после чего-либо, ожидающего того же события, вы сделаете что-то вроде этого :

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

Вы должны использовать attachEvent() для старых версий IE.

При использовании этого метода вам не нужно беспокоиться о том, где ваши скрипты загружаются на страницу по сравнению с другими сценариями на странице, так как это позволяет сценарию запускаться в определенное время после определенного события.

1

извините за поздний ответ.

Я нашел решение:

var loading_var = 0; 

    function f1() { 
     loading_var++; 
     /*code to be executed*/ 
     onready(); 
    } 

    function f2() { 
     loading_var++; 
     /*The same for each function in your code*/ 
     onready(); 
    } 

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

Я использую это в яваскрипта игре, чтобы запретить пользователям взаимодействовать с игрой, так как функция по-прежнему выполняется.