2015-03-25 4 views

ответ

4

Обновлено Ответ

Ваш comment below, что вы имеете в виду код в this answer изменяет вещи заметно.

Код в этом ответе:

$(document) 
    .queue(callMe1) 
    .queue(callMe2); 

... и затем есть комментарий предполагая, используя {} вместо document:

$({}) 
    .queue(callMe1) 
    .queue(callMe2); 

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

Давайте возьмем пример: предположим, что я хочу делать три вещи один за другим, и каждая из этих вещей может или не может делать что-то асинхронное, как анимация. Мы могли бы это сделать:

$({}).queue(theFirstThing) 
    .queue(theSecondThing) 
    .queue(theThirdThing); 

... и более поздние функции не вызывались бы до тех пор, пока более ранние функции не сказали, что они были выполнены.

Пример:

$({}).queue(theFirstThing) 
 
    .queue(theSecondThing) 
 
    .queue(theThirdThing); 
 

 
function theFirstThing(next) { 
 
    // What I do is asynchronous: Fade out the a1 element, 
 
    // then call the next function in the chain if any 
 
    $("#a1").fadeOut("slow", next); 
 
} 
 
function theSecondThing(next) { 
 
    // What I do is synchronous 
 
    $("<p>Hi there</p>").appendTo(document.body); 
 
    
 
    // Chain to next if any 
 
    next(); 
 
} 
 
function theThirdThing(next) { 
 
    // What I do is asynchronous: Fade out the a2 element, 
 
    // then call the next function in the chain if any 
 
    $("#a2").fadeOut("slow", next); 
 
}
<div id="a1">a1</div> 
 
<div id="a2">a2</div> 
 
<div id="a3">a3</div> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>


Оригинал ответа:

The documentation говорит нам:

JQuery (объект)

объект
Тип: PlainObject
простой объект, чтобы обернуть в объект JQuery.

Например, он обертывает экземпляр jQuery вокруг простого объекта. Мы привыкли к экземплярам jQuery, обернутым вокруг одного или нескольких элементов DOM, но они также могут быть обернуты вокруг других вещей.

Затем они делают queue на результирующем JQuery объекта:

.queue ([ИмяОчереди], обратного вызова)

ИмяОчереди
Тип: String
A строка, содержащая имя очереди. По умолчанию fx, стандартная очередь эффектов.

обратного
Тип: Function (Функция следующей())
Новая функция для добавления в очередь, с помощью функции для вызова, который будет из очереди следующий пункт.

Так что говорит нам, что он делает: Обертывание объекта JQuery вокруг простого объекта, то вызов queue положить что-то в очереди анимации по умолчанию для этого объекта JQuery, даже если нет элементов в этом анимировать.

Почему люди используют эту форму?

Я никогда не видел этого. Я не могу думать о какой-либо причине, чтобы использовать его, как показано на ваш вопрос, он просто заканчивается вызовом функции немедленно, во время queue вызова, как мы можем видеть здесь:

$({}).queue(function(next){ 
 
    snippet.log("Function called"); 
 
    next(); 
 
}); 
 
snippet.log("queue call complete");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

+0

Это, безусловно, странно. Спасибо, T.J.! –

+0

да T.J. Я нашел его здесь http://stackoverflow.com/questions/5230333/how-to-avoid-callback-chains/5230395#5230395 –

+1

@JenniferMassey: '$ (document) .queue (...)' is ** очень разные ** из '$ ({}). queue (...)' и несколько вызовов '.queue' меняют вещи только из одного. Я думаю, что этот вопрос и его ответ объясняют, почему они используют это достаточно хорошо. –

-2

Всякий раз, когда контекст не передается объекту jQuery, контекст устанавливается в «документ». Поскольку $() не имеет контекста, контекст затем по умолчанию ссылается на документ. То же самое с выполнением $ ([]) ans $ ({}).

+0

Спасибо! Тогда почему бы не просто $()? –

+0

http://jsfiddle.net/gmq84a9k/ - если это будет означать то же, что и «документ», почему это не так? – nicael

+2

@Jenn Слишком рано благодарить; ** этот ответ неверен **. – nicael

1

Раньше я использовал $ ({}), когда создавал экземпляр переменной, которая позже будет заменена реальным объектом JQuery, так что в случае неожиданного результата исходное значение все еще является допустимым объектом JQuery. В этом случае это может и не понадобиться.

При проверке одним существенным отличием между $() и $ ({}) является значение .length. 0 и 1 соответственно. Хороший вопрос и беседа. +1

+1

* «В этом случае это может быть и не нужно». * Это не так, просто используйте '$()'. –

Смежные вопросы