JavaScript в веб-браузерах является однопоточным (за исключением использования веб-работников ), поэтому, если ваш код JavaScript работает, по определению никакой другой код JavaScript не выполняется. *
Чтобы убедиться, что ваш скрипт выполняется после того, как все другие JavaScript на странице были загружены и оценены, и после того, как все рендеринг произошел, некоторые предложения:
- Поместите тег script для вашего кода в самом концефайла.
- Используйте атрибуты
defer
и async
в теге (они будут игнорироваться браузерами, которые их не поддерживают, но цель состоит в том, чтобываш последний столько, сколько мы можем). - Перехват события
window
load
через соединение в стиле 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
], но они на границеслучаев, и все еще активно выполняется только одна вещь.)