jQuery: Принудительный порядок выполнения вызовов document.ready().

Я работаю над кодовой базой с несколькими блоками кода, задающей некоторое поведение для document.ready() (jQuery). Есть ли способ заставить этот конкретный блок вызываться перед любым другим?

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

5 ответов

Решение

document.ready() обратные вызовы вызываются в том порядке, в котором они были зарегистрированы. Если вы сначала зарегистрируете свой тестовый обратный вызов, он будет вызван первым.

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

Другая идея заключается в том, что (только для целей тестирования) вы можете запустить с немного измененной версией jQuery, которая добавляет флаг к document.ready() что когда прошло и установлено true указано, чтобы сначала вызвать эту функцию, или вы можете добавить новый метод document.readyFirst() это вызовет вашу функцию в первую очередь. Это повлечет за собой незначительные изменения в document.ready() Обработка кода в JQuery.

Как @ Jfriend00 упомянуть, что ready callbacks are called in the order they were registered.

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

jQuery(document).ready(function(){
    jQuery(document).ready(function(){
        // This block will be executed after all ready calls.
    });
});

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

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

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

Я обернул его в функцию.beforeReady() и поместил на GitHub как jQuery-Before-Ready для всех, кто заинтересован. https://github.com/aim12340/jQuery-Before-Ready

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

Другие вопросы по тегам