2010-11-04 1 views
10

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

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

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

[ Изменить]:

как пример

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

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

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

[Далее Edit]

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

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

Что вы делаете, когда вам нужно добавить код, который выполняется перед функцией beforeReady? Вы добавите beforeBeforeReady? Иногда вам просто нужно укусить пулю и сделать то, что нужно сделать, и исправить код, чтобы это имело смысл. –

+0

@Jani у вас может быть действительная точка. Тем не менее, я бы предпочел создать beforeReady, а затем заменить все события .ready с .bind («загружен») и заменить beforeReady на .bind («setup») – Raynos

+0

Эта проблема должна быть исправлена ​​в следующей версии jQuery: https: // github.com/jquery/jquery/pull/80 – Mottie

ответ

15

Это будет время, когда я вызвал бы пользовательское событие, что все ваши другие файлы будут bind to, у вас будет только один обработчик 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

«// make setup stuff» является необязательным и выполняется только с нескольких страниц. «// здесь здесь» выполняется на каждой странице. что я не хочу включать в себя $ (окно) .trigger ("someCustomEvent") на каждой странице – Raynos

+0

@Raynos, вы можете запустить другое настраиваемое событие, чтобы выполнить настройку. –

+0

Если у меня есть несколько функций на готовом документе, не гарантируйте заказ или не выберите функцию, в которой запускается настройка, потому что я не могу гарантировать, что любая из готовых функций является первой, которую вызывается jQuery – Raynos

0

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

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

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

+0

Мне больше не нужно беспокоиться о точном порядке моего кода с включенным в него везде, а скорее задавать порядок в коде. – Raynos

+0

Хм, возможно, вы должны прекратить вставлять .ready() повсюду. Обычно я использую только один .ready(), где я запускаю все свои плагины и сохраняю его в одном файле, в котором нет ничего (каламбур). ;) – BGerrissen

+2

Если бы у меня было время, чтобы отредактировать весь унаследованный проект, чтобы я работал так. Пока я застрял с постепенным улучшением. – Raynos

0

У меня была точно такая же проблема. Я поместил крошечный скрипт в 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>