#javascript #jquery
#javascript #jquery
Вопрос:
у меня запущен текущий код
что я хочу сделать, так это заставить анимацию идти в бесконечном цикле, как это сделать??
я хочу снова вызвать ту же функцию, или я не знаю, что
просто анимация повторяется снова и снова, когда заканчивается последний элемент
(function($) {
$.fn.fade = function() {
return this.each(function(index, item) {
var $this = $(this).siblings();
$(item).hide().stop();
if ($(item).index() == $(this).siblings().length - 1) {
$(item).delay(5000 * index).fadeIn('slow').delay(3500).fadeOut('slow', function() {
/* here is the last element finishing */
});
} else {
$(item).delay(5000 * index).fadeIn('slow').delay(3500).fadeOut('slow');
}
});
};
})(jQuery);
$('.tst').fade();
РЕДАКТИРОВАТЬ: я оставил анимацию запущенной и пришел, чтобы проверить ответы
, поэтому я увидел странное поведение
как это исправить
Комментарии:
1. В английском языке в начале предложений используются заглавные буквы.
Ответ №1:
Самый простой способ — присвоить функции имя и вызвать ее снова: http://jsfiddle.net/pimvdb/SxTgy/4 /.
$.fn.fade = function x() {
var _this = this; // keep the 'this' value
После окончательной анимации вызовите x
снова, передав this
значение, которое оно имело:
x.call(_this); // same as x() but it sets the 'this' value inside it correctly
Обратите внимание, что такие «выражения именованных функций» имеют определенные особенности в IE8- .
Комментарии:
1. причуды в каждом браузере пытаются уменьшить время на 1/10 и посмотреть, как это будет сделано
2. @Qchmqs: Вы устанавливаете затухание сразу. Возможно, было бы лучше анимировать # 1, затем, когда он будет завершен, начните анимировать # 2 и т. Д. (вроде рекурсивно). Тогда вы уверены, что вторая начинается после первой.
3. да, все сразу исчезают, чтобы избежать причуд, попробуйте выполнять их один за другим, и вы увидите, как они будут перепутаны после 2 или 3 циклов
4. я использовал 7 элементов li, чтобы ясно видеть, что первые запуски для всех из них, второй цикл составляет всего 6, и в итоге у вас будет только два элемента, которые исчезают и выходят одновременно
Ответ №2:
Попробуйте это (хотя вам придется адаптировать его к своей структуре плагинов):
var elements = $('ul > li');
(function fade(idx) {
$(elements).eq(idx || 0).fadeIn(1500).fadeOut(1500, function () {
fade(idx < elements.length - 1 ? idx 1 : 0);
});
}());
Комментарии:
1. Есть ли какие-либо проблемы со стеком в этом решении? Я не думал, что JavaScript настолько умен в оптимизации подобных вызовов функций, но было бы здорово, если бы это было так…
2. @Weston C:
fade
здесь не вызывает себя напрямую, поэтому стек не растет. Когдаfade()
выполняется, он может завершиться после выполнения функций jQuery, потому что он еще не вызывает обратный вызов.