Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Как @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.
    });
});

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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