Запуск функции непосредственно перед срабатыванием $ (document) .ready () - PullRequest
11 голосов
/ 04 ноября 2010

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

Есть ли способ обработать порядок функций, которые jQuery запускает внутри как часть jQuery.fn.ready, или подключить функцию, которая вызывает непосредственно перед jQuery.fn.ready.

Правильно ли редактирует jQuery.fn.ready в стороннем скрипте или это вызовет ужасный удар по эффектам в других сторонних плагинах (кроме плагинов, которые сами редактируют jQuery.fn.ready)

[Изменить]:

в качестве примера

$(document).ready(function b() {});
....
$(document).ready(function a() {/* optional setup*/});
....
$(document).ready(function c() {});

Функция a должна происходить сначала независимо от порядка, но вызывается только на нескольких страницах. Я не могу гарантировать порядок b или c, поэтому не могу инициировать пользовательские события в начале b или c, чтобы вызвать a.

Так что я хотел бы использовать универсальное решение, которое можно использовать для принудительного размещения a в начале внутреннего readyList jQuery или подключения к функции ready jQuery и безопасного ее редактирования, чтобы оно вызывало a перед любой из других функций в readyList.

[Дальнейшее редактирование]

Если возможно, я бы предпочел не перепроектировать порядок выполнения кода javascript или касаться любого другого кода, кроме функции a (). Я знаю, что реструктуризация позволила бы мне обойти эту проблему, но я бы просто написал одну функцию, такую ​​как

$.beforeReady(function a() {});

Ответы [ 3 ]

16 голосов
/ 04 ноября 2010

Это будет время, когда я вызову пользовательское событие, к которому все ваши другие файлы будут bind, у вас будет только один обработчик ready, который будет делать вещи, а затем вызовет пользовательское событие.

Таким образом, где-то еще в вашем коде вместо $(document).ready вы бы использовали

$(window).bind('setup', function() {
   //code here...
});

И / или

$(window).bind('loaded', function() {
   //some other code here...
});

И в своем единственном ready обработчик, вы бы сделали что-то вроде этого:

$(document).ready(function() {
   $(window).trigger('setup');
   $(window).trigger('loaded'):
});
0 голосов
/ 21 апреля 2017

У меня точно такая же проблема. Я поместил крошечный скрипт на GitHub, который добавляет функцию $ .beforeReady (). Приколы:)

https://github.com/aim12340/jQuery-Before-Ready

Просто загрузите скрипт сразу после jQuery, как в этом примере:

<html>
    <head>
        <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
        <script src="jquery-before-ready.js"></script>
    </head>
    <body>
        <script>
            $(document).ready({
                alert("This function is declared first!")
            })
        </script>
        <script>
            $.beforeReady(function(){
                alert("This function is declared second but executes first!")
            })
        </script>        
    </body>
</html>
0 голосов
/ 04 ноября 2010

$(document).ready() или просто $(function(){}) - это просто реализация .addEventListener (не совсем точно, но близко), что означает, что вы можете добавлять слушателей до и после.

$(document).ready(listener); // goes off first.
$(document).ready(otherListener); // goes off 2nd.

И так далее, сэндвич-функции не сложно. Нет необходимости взламывать .ready() IMO.

...