jQuery:添加delay()和removeClass()后代码停止工作

这是我的代码……

$('nav ul li').hover(function() { $(this).addClass('hoverIn'); }, function() { $(this).addClass('hoverOut'); }); 

哪个工作正常。

但是,当我添加delay()和removeClass()时,它不起作用,如下所示……

  $('nav ul li').hover(function() { $(this).addClass('hoverIn').delay(800).removeClass('hoverIn'); }, function() { $(this).addClass('hoverOut').delay(800).removeClass('hoverOut'); }); 

我在这里做错了吗?

任何帮助将不胜感激。 谢谢。

正如其他人所提到的, .removeClass()不是动画函数,所以不受任何排队效果的影响。

最简单的解决方案是使用.queue()将您的调用插入到动画队列中:

 $(this).addClass('hoverIn').delay(800).queue(function() { $(this).removeClass('hoverIn').dequeue(); }); 

.dequeue()调用对于确保仍然发生任何其他排队操作非常重要。

请注意,使用动画队列还意味着您可以使用.stop()取消操作(如果尚未发生)。 使用计时器会使事情变得更加复杂。


如果你想得到真正的幻想,我刚敲出的这个插件将允许你将任意 jQuery函数添加到动画队列中:

 (function($) { $.fn.queued = function() { var self = this; var func = arguments[0]; var args = [].slice.call(arguments, 1); return this.queue(function() { $.fn[func].apply(self, args).dequeue(); }); } }(jQuery)); 

有了这个,上面的行将成为:

 $(this).addClass('hoverIn').delay(800).queued('removeClass', 'hoverIn'); 

演示http://jsfiddle.net/alnitak/h5nWw/

.delay()仅适用于使用动画队列的jQuery方法,因此不适用于removeClass()

removeClass()操作仍将执行,但会立即执行,而不是在延迟时间之后执行。

所以,当你这样做时:

 $(this).addClass('hoverIn').delay(800).removeClass('hoverIn'); 

这与:

 $(this).addClass('hoverIn').removeClass('hoverIn'); 

这与无所事事是一样的,因此你看不到效果。


您可以使用setTimeout()解决您的问题,如下所示:

  $('nav ul li').hover(function() { var self = $(this).addClass('hoverIn'); setTimeout(function() {self.removeClass('hoverIn');}, 800); }, function() { var self = $(this).addClass('hoverOut'); setTimeout(function() {self.removeClass('hoverOut');}, 800); }); 

或者,使用常见function,如下所示:

 jQuery.fn.addClassTemporary = function(cls, t) { var self = this.addClass(cls); setTimeout(function() {self.removeClass(cls);}, t); } $('nav ul li').hover(function() { $(this).addClassTemporary('hoverIn', 800); }, function() { $(this).addClassTemporary('hoverOut', 800); }); 

jQuery .delay()适用于动画队列,它不像setTimeout那样充当计时器……

为了您的目标,我建议您使用hoverIntent插件 :

看到这个工作小提琴示例! 调整超时以满足您的需求

jQuery的

 $("nav ul li").hoverIntent({ sensitivity: 1, // number = sensitivity threshold (must be 1 or higher) interval: 10, // number = milliseconds for onMouseOver polling interval timeout: 800, // number = milliseconds delay before onMouseOut over:function(){ $(this).removeClass("hoverOut").toggleClass("hoverIn"); }, out: function(){ $(this).removeClass("hoverIn").toggleClass("hoverOut"); } });