Большинство ванильных функций JS Ready НЕ учитывают сценарий, в котором обработчик DOMContentLoaded
установлен после , когда документ уже загружен. Это означает, что функция никогда не запустится . Это может произойти, если вы ищете DOMContentLoaded
во внешнем скрипте async
(<script async src="file.js"></script>
).
Приведенный ниже код проверяет DOMContentLoaded
только в том случае, если readyState
документа еще не interactive
или complete
.
var DOMReady = function(callback) {
document.readyState === "interactive" || document.readyState === "complete" ? callback() : document.addEventListener("DOMContentLoaded", callback());
};
DOMReady(function() {
//DOM ready!
});
Если вы хотите поддерживать IE также:
var DOMReady = function(callback) {
if (document.readyState === "interactive" || document.readyState === "complete") {
callback();
} else if (document.addEventListener) {
document.addEventListener('DOMContentLoaded', callback());
} else if (document.attachEvent) {
document.attachEvent('onreadystatechange', function() {
if (document.readyState != 'loading') {
callback();
}
});
}
};
DOMReady(function() {
// DOM ready!
});