Эквивалент jQuery $.ready() на чистом JavaScript - как вызвать функцию, когда страница/DOM готовы (дубликат)
Проблема:
Я изучаю, как выполнить определенные функции в стандартном JavaScript, как это делает функция .ready()
в jQuery.
С помощью jQuery мы все знаем, как прекрасно работает функция:
$('document').ready(function(){});
Однако мне нужно запустить функцию, написанную на чистом JavaScript, без использования библиотек. Я хочу, чтобы функция выполнялась, как только страница будет готова к ее обработке. Какой правильный подход к этой задаче?
Я знаю, что могу сделать так:
window.onload = function() {
myFunction();
};
Или использовать тег <body>
:
<body onload="myFunction()">
Также я могу разместить скрипт внизу страницы, перед закрывающим тегом </body>
:
<script type="text/javascript">
myFunction();
</script>
Однако меня интересует, какой метод с учетом кросс-браузерной совместимости (как для старых, так и для новых браузеров) позволит мне вызывать одну или несколько функций аналогично jQuerys
$.ready()`?
5 ответ(ов)
Тестировалось в IE9, а также в последних версиях Firefox и Chrome, поддерживается и в IE8.
document.onreadystatechange = function () {
var state = document.readyState;
if (state == 'interactive') {
init();
} else if (state == 'complete') {
initOnCompleteLoad();
}
};
Пример: http://jsfiddle.net/electricvisions/Jacck/
ОБНОВЛЕНИЕ - многоразовая версия
Я только что разработал следующее решение. Это довольно простая альтернатива jQuery или событию DOM ready без обратной совместимости. Возможно, её нужно дополнительно улучшить. Тестировалось в последних версиях Chrome, Firefox и IE (10/11), и должно работать и в более старых браузерах, как указано в комментариях. Я обновлю информацию, если обнаружу какие-либо проблемы.
window.readyHandlers = [];
window.ready = function ready(handler) {
window.readyHandlers.push(handler);
handleState();
};
window.handleState = function handleState() {
if (['interactive', 'complete'].indexOf(document.readyState) > -1) {
while (window.readyHandlers.length > 0) {
(window.readyHandlers.shift())();
}
}
};
document.onreadystatechange = window.handleState;
Использование:
ready(function () {
// ваш код здесь
});
Скрипт написан для обработки асинхронной загрузки JS, но вы можете захотеть загрузить его синхронно в начале, если не используете минификацию. Я нашел это решение полезным в процессе разработки.
Современные браузеры также поддерживают асинхронную загрузку скриптов, что дополнительно улучшает пользовательский опыт. Поддержка async означает, что несколько скриптов могут загружаться одновременно, не мешая рендерингу страницы. Просто будьте осторожны с зависимостями от других скриптов, загружаемых асинхронно, или используйте минификатор или что-то вроде browserify для управления зависимостями.
Хорошие люди из HubSpot подготовили ресурс, где вы можете найти методы на чистом JavaScript, позволяющие достичь многих замечательных возможностей jQuery, включая функцию ready
. Вот ссылка на этот ресурс:
http://youmightnotneedjquery.com/#ready
Вы можете использовать следующий код для реализации функционала ready
:
function ready(fn) {
if (document.readyState != 'loading') {
fn();
} else if (document.addEventListener) {
document.addEventListener('DOMContentLoaded', fn);
} else {
document.attachEvent('onreadystatechange', function() {
if (document.readyState != 'loading')
fn();
});
}
}
Пример использования этой функции:
ready(function() { alert('hello'); });
Таким образом, вы сможете выполнить код, как только документ будет полностью загружен, не прибегая к jQuery.
Не вполне уверен, что именно вы имеете в виду, но, возможно, это поможет:
window.onload = function(){
// Код. . .
}
Или:
window.onload = main;
function main(){
// Код. . .
}
Ваш метод (размещение скрипта перед закрывающим тегом </body>
) является надежным способом поддержки как старых, так и новых браузеров. Этот подход гарантирует, что DOM-элементы страницы будут загружены перед выполнением вашего скрипта, что предотвращает ошибки, связанные с попытками взаимодействия с элементами, которые еще не были загружены. Использование данного метода позволяет писать более стабильный и совместимый код. Вот пример, как это можно реализовать:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Пример</title>
</head>
<body>
<h1>Привет, мир!</h1>
<script>
myFunction();
</script>
</body>
</html>
Таким образом, ваш скрипт будет выполнен только после полной загрузки содержимого страницы, что делает его использование рекомендованным подходом.
Готово
function ready(fn) {
var d = document;
(d.readyState == 'loading') ? d.addEventListener('DOMContentLoaded', fn) : fn();
}
Используйте так:
ready(function() {
// ваш код
});
Для самовыполняющегося кода
(function(fn) {
var d = document;
(d.readyState == 'loading') ? d.addEventListener('DOMContentLoaded', fn) : fn();
})(function() {
// Ваш код здесь
// DOM доступен
// var h1s = document.querySelector("h1");
});
Поддержка: IE9+
Как узнать, какая радиокнопка выбрана с помощью jQuery?
Как проверить, отмечен ли чекбокс в jQuery?
Эквивалент document.createElement в jQuery?
Как выбрать элемент по имени с помощью jQuery?
jQuery: Получение Выбранного Значения Из Выпадающего Списка