2013-02-14 2 views
3

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

Следующий код работает только на загрузку одной страницы (он добавит класс, а затем удалит его через 1 секунду, а если я снова нажму, он добавит класс, но НИКОГДА не удалит класс на время страница, если я не перезагрузите страницу):

var jElement = $(currElem); 
jElement.addClass("highlight") 
.delay(1000) 
.queue(function(){ 
$(this).removeClass("highlight"); 
}); 

ОДНАКО,

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

var jElement = $(currElem); 
jElement.addClass("highlight") 
.delay(1000) 
.queue(function(randomFunction){ 
$(this).removeClass("highlight"); 
randomFunction(); //this makes it seemingly 'miraculously' work?? 
}); 

Side Примечание:

var jElement = $(currElem); 
jElement.addClass("highlight") 
.delay(1000) 
.queue(function(randomFunction){ 
$(this).removeClass("highlight"); 
// this does NOT work; if I dont actually call the 'randomFunction' 
// so that function, even though it does nothing; must somehow cause 
// the implicit call of 'dequeue()' ?? 
}); 
+0

Расскажите, пожалуйста, что именно вы пытаетесь достичь с помощью приведенного выше кода. – Venemo

+0

Я пытался подражать «временной подсветке» для любого поля ввода, которое не содержало достоверной информации. [Для скрипта проверки формы]. Я заметил, что мой точный код работает независимо от того, включена ли функция, которую я передаю, с именем «next» или нет. Может ли кто-нибудь объяснить это поведение? Его недостаточно, чтобы просто передать функцию, вы также должны вызвать ее внутри анонимной функции. Я мог видеть, как перегрузка функций может вызывать это неявное поведение «dequeue()», но сам триггер существует ВНУТРИ анонимной функции. –

ответ

2

в randomFunction фактически упоминается как next и ссылки метод .dequeue. Вызов вызывает очередь для перехода к следующему элементу в очереди.

http://api.jquery.com/queue/

5

Там нет никакого чуда там. Такое поведение написано в документации .queue().

Обратите внимание, что при добавлении функции с .queue(), мы должны убедиться, что .dequeue() в конце концов называется так, что следующая функция в строке выполняется.

$('#foo').slideUp().queue(function() { 
    alert('Animation complete.'); 
    $(this).dequeue(); 
}); 

По JQuery 1.4, функция, которая называется передается другой функции в качестве первого аргумента. При вызове это автоматически деактивирует следующий элемент и перемещает очередь. Мы используем его следующим образом:

$("#test").queue(function(next) { 
    // Do some stuff... 
    next(); 
}); 
+0

Спасибо всем, кто ответил так быстро. Я посмотрел API для queue() и, по общему признанию, я получил чрезвычайно перегруженный, прежде чем я достиг описания dequeue() и next(). Я редко прошу помощи и, как правило, сам нахожу ответ, потому что это сайты, которые меня раздражают, поэтому я подписался и спросил. Мне очень нравится это сообщество и, безусловно, планирую внести свой вклад, когда я уверен, что освоил основы jQuery (и других языков). –