一开始鼠标的hover事宜我都会用css:hover伪类来完成,它的特性也很明显,就是无延时马上触发,但偶然可能会形成一些滋扰,想要用户体验更好的话就要用js。
比方,让鼠标在元素上停止划定时刻内才触发hover事宜。我在一篇博文上找到一段比较好的处置惩罚代码 :
文章出处
(function($){
$.fn.hoverDelay = function(options){
var defaults = {
// 鼠标经由的延时时刻
hoverDuring: 200,
// 鼠标移出的延时时刻
outDuring: 200,
// 鼠标经由实行的要领
hoverEvent: function(){
// 设置为空函数,绑定的时刻由应用者定义
$.noop();
},
// 鼠标移出实行的要领
outEvent: function(){
$.noop();
}
};
var sets = $.extend(defaults,options || {});
var hoverTimer, outTimer;
return $(this).each(function(){
$(this).hover(function(){
// 消灭定时器
clearTimeout(outTimer);
hoverTimer = setTimeout(sets.hoverEvent,
sets.hoverDuring);
}, function(){
clearTimeout(hoverTimer);
outTimer = setTimeout(sets.outEvent,
sets.outDuring);
});
});
}
})(jQuery);
// 详细应用,给id为“#test”的元素增加hoverEvent事宜
$("#test").hoverDelay({
// 自定义,outEvent同
hoverEvent: function(){
alert("经由我!");
}
});
这段代码好在于把鼠标经由事宜和延时分离出来,延时以及耽误的消灭都交由hoverDelay来处置惩罚,详细hover事宜本身自定,是一段可以很通用的代码。
但应用起来另有些小题目,在自定义hoverEvent、outEvent中应用this的话,它所指向的是window这个对象,而不是当前上下文,所以我革新了下,经由过程apply()来完成this绑定。
革新部份:
return $(this).each(function(){
// 保留当前上下文的this对象
var $this = $(this)
$this.hover(function(){
clearTimeout(outTimer);
hoverTimer = setTimeout(function () {
// 挪用替代
sets.hoverEvent.apply($this);
}, sets.hoverDuring);
}, function(){
clearTimeout(hoverTimer);
outTimer = setTimeout(function () {
sets.outEvent.apply($this);
}, sets.outDuring);
});
});
改完今后我本身的小项目都用这个要领来处置惩罚hover或许其他的延时结果了。