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

28

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

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

@AnkitSoni при условии, что он размещен в тегах html, а все другие блоки кода зависят от DOMReady, он будет выполняться перед любым кодом внутри блоков DOMReady. Kevin B
Код блока регистрации ошибок действительноneed ждать, пока DOM будет готов? Kevin B
@KevinB Отличный момент! Это может даже стоить того, чтобы не ждать ... msanford
Он работает именно там, где вы помещаете его в свой DOM. Если это первый тег скрипта на вашей странице (скажем, в верхней части HTML-кода)head) он будет запущен первым. Paulpro
@KevinB Я не очень знаком с JS. Если бы я поместил код вне какого-либо блока, гарантированно ли он работал до того, как какой-либо другой код был выполнен? Ankit Soni

Ваш Ответ

5   ответов
7

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

1

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

1

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

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

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

12

Как @ 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.
    });
});
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
26

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

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

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

Error: User Rate Limit Exceeded Ankit Soni
Error: User Rate Limit Exceeded

Похожие вопросы