Вопрос о множественных готовых()
Предположим, что у меня есть:
<script src="script1.js"></script>
<script src="script2.js"></script>
Оба этих сценария имеют ready()
внутри. Будет ли код в script2.js ready()
всегда выполняться после первого?
Ответы
Ответ 1
Да.
Прежде всего, код в script2.js
будет выполнен после script1.js
, как это происходит позже в документе (и атрибут defer
не установлен).
Кроме того, реализация [source] функции ready
:
ready: function( fn ) {
// Attach the listeners
jQuery.bindReady();
// Add the callback
readyList.done( fn );
return this;
},
где readyList
кажется [source] a отложенный объект [docs]. Это означает, что обратные вызовы выполняются в том порядке, в котором они были добавлены к этому объекту.
Ответ 2
jQuery использует для этого свой собственный объект Deferred
. Соответствующий код jQuery доказывает, что он выполняется в следующем порядке:
Когда вы вызываете .ready
, функция добавляется к readyList
:
readyList.done( fn );
Когда DOM готов, эта функция выполняется:
readyList.resolveWith( document, [ jQuery ] );
Функция resolveWith
содержит этот код, который выполняет функции, добавленные как обратные вызовы:
while( callbacks[ 0 ] ) {
callbacks.shift().apply( context, args );
}
Как вы можете видеть, функции обратного вызова shift
ed (выскользнули с начала массива обратного вызова (т.е. readyList
)), поэтому сначала выполняется выполнение перед вторым.
Ответ 3
Несколько готовых документов будут запущены, чтобы они перестали работать.
Ответ 4
.ready()
функции вызываются при первом зарегистрированном получении первой обработанной базы