будет ли onLoad всегда запускаться после готовности DOM? - PullRequest
3 голосов
/ 12 февраля 2012

Я хочу отключить некоторую особую «функцию», которую мои плагины делают с DOM, когда DOM готов.

Если я помещу свой код в обратный вызов onload, будет ли он всегда выполняться после обратного вызова ready?

Я хочу на 100% быть уверенным, что даже если не будет изображений только из нескольких, готовность будет выполнена до загрузки.

Ответы [ 3 ]

3 голосов
/ 12 февраля 2012

Хотя я думаю @ jAndy's ответ прав, вы можете себе позволить дополнительную уверенность, также поместив код в onload в ready() вызове.

Просто сделайтеубедитесь, что ваш основной ready() вызов идет первым.

$(document).ready(function() {
    // Your normal ready handler
});

$(window).load(function() {
    // Placing code in another .ready() call in here will add it to the
    //    end of internal Array of ready handlers if any are pending
    $(document).ready(function() {
        // my onload code
    });
});

Так что, если ready() уже сработал к моменту запуска onload, ваш код onload все равно будет выполняться. (Внутренний флаг устанавливается, когда DOM готов, поэтому будущие вызовы .ready() будут немедленно вызваны.)

Если .ready() каким-то образом не сработалкогда произойдет onload, это будет означать, что ваш исходный код ready() будет первым во внутреннем массиве, а новый код .ready() будет добавлен в конец массива.


EDIT:

Поиск в источнике для основного обработчика jQuery.ready, который запускается, когда DOM готов (который, в свою очередь, запускает списокиз .ready() обработчиков пользователя) , похоже, что есть ошибка IE, когда обработчик запускается немного раньше.

Чтобы исправить эту ошибку, jQuery делает обработчик асинхронно вызывается до тех пор, пока он действительно не увидит document.body.


ready: function (wait) {
    // Either a released hold or an DOMready/load event and not yet ready
    if ((wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady)) {
<b>
        // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
        if (!document.body) {
            return setTimeout(jQuery.ready, 1);
        }
</b>
        // Remember that the DOM is ready
        jQuery.isReady = true;

        // If a normal DOM Ready event fired, decrement, and wait if need be
        if (wait !== true && --jQuery.readyWait > 0) {
            return;
        }

        // If there are functions bound, to execute
        readyList.fireWith(document, [jQuery]);

        // Trigger any bound ready events
        if (jQuery.fn.trigger) {
            jQuery(document).trigger("ready").off("ready");
        }
    }
},

Казалось бы, из-за этого асинхронного зацикливания обработчика IE, по крайней мере, будет склонен вызывать обработчик window.onload до.ready() обработчики.

Добавление к обработчику .ready()Список в onload, как я описал выше, должен исправить это.

1 голос
/ 12 февраля 2012

Да.

  • onload будет срабатывать при загрузке чего-либо еще (изображений, кадров, фреймов и т. Д.),
  • DOMContentLoaded сработает, как только дерево DOM сможет получить доступ.
0 голосов
/ 17 июля 2017

Нет. Попробуйте сами: создайте большой HTML-файл, удалите каждый зависимый ресурс (изображения, сценарии, таблицы стилей) и протестируйте.

enter image description here

Загрузка срабатывает, когда каждый ресурс выбирается из Интернета. DOMContentLoad запускается, когда HTML извлекается и анализируется. Последнее заняло 14 мс в моем тесте с 140 КБ HTML-кода. Конечно, это крайний случай, но нет никакой гарантии, что загрузка запускается до DOMContentLoaded - даже с внешними ресурсами (из-за кэширования, параллельных загрузок с HTTP / 2, быстрых соединений).

...