jQuery 鼠标经过(hover)事件的延时处理示例


Posted in Javascript onApril 14, 2014

一、关于鼠标hover事件及延时
鼠标经过事件为web页面上非常常见的事件之一。简单的hover可以用CSS :hover伪类实现,复杂点的用js。

一般情况下,我们是不对鼠标hover事件进行延时处理。但是,有时候,为了避免不必要的干扰,常会对鼠标hover事件进行延时处理。所谓干扰,就是当用户鼠标不经意划过摸个链接,选项卡,或是其他区域时,本没有显示隐藏层,或是选项卡切换,但是由于这些元素上绑定了hover事件(或是mouseover事件),且无延时,这些时间就会立即触发,反而会对用户进行干扰。

例如,在腾讯网首页,几乎对所有的鼠标经过事件进行了延时处理,例如其选项卡:

jQuery 鼠标经过(hover)事件的延时处理示例 

或是其顶部的搜搜导航条,见下图:

jQuery 鼠标经过(hover)事件的延时处理示例 

二、实例及演示
本文的主要内容就是展示我前几天写的鼠标延迟的方法,jQuery下的方法,水平拙劣,仅供参考。本文就以腾讯网首页搜搜搜索栏的一些鼠标经过效果为实例,演示jQuery下的延时处理。下图为demo页面的效果截图:

jQuery 鼠标经过(hover)事件的延时处理示例 

三、代码与实现
说到延时,离不开window下的setTimeout方法,本实例的jQuery方法的核心也是setTimeout。代码不长,完整如下:

(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);

这段代码的目的在于让鼠标经过事件和延时分离的出来,延时以及延迟的清除都已经由此方法解决了。您所要做的,就是设定延时的时间大小,以及相应的鼠标经过或是移除事件即可。举个简单的例子吧,如下代码:
$("#test").hoverDelay({ 
hoverEvent: function(){ 
alert("经过我!"); 
} 
});

表示的含义是id为test的元素在鼠标经过后200毫秒后弹出含有“经过我!”文字字样的弹出框。

ok,现在应用到本文的实例上。

腾讯网的首页的搜索框上面除了鼠标经过延时,其换肤也是值得一提的,关于换肤我之前也提过,在jQuery-马化腾产品设计与用户体验的一些技术实现一文中,相应的demo页面您可以狠狠地点击这里:腾讯首页个性化换肤demo页面

首先,展示下腾讯首页搜索栏的主要HTML结构域代码:

<div id="sosoFod"> 
<h3 id="sosoweb" class="s1">网页</h3> 
<h3 id="sosoimg" class="s2">图片</h3> 
<h3 id="sosovid" class="s2">视频</h3> 
<h3 id="sosomus" class="s2">音乐</h3> 
<h3 id="sososoba" class="s2">搜吧</h3> 
<h3 id="sosowenwen" class="s2">问问</h3> 
<h3 id="sosoqz" class="s2">博客</h3> 
<h3 style="cursor:pointer;" class="s2">更多? 
<div style="display:none;" class="more" id="tm"> 
<ul> 
<li><a href="#">综合</a></li> 
<li><a href="#">新闻</a></li> 
<li><a href="#">词典</a></li> 
<li><a href="#">生活</a></li> 
<li><a href="#">百科</a></li> 
<li style="border-top:1px solid rgb(178, 208, 234);"><a href="#">所有产品</a></li> 
</ul> 
</div> 
</h3> 
</div>

与先首页代码几乎一致,如假包换。应用了本文没什么技术含量的延迟方法后,可以应用如下的代码实现延迟执行。
$(".s2").each(function(){ 
$("#sosoFod h3").each(function(){ 
var that = $(this); 
var id = that.attr("id"); 
if(id){ 
that.hoverDelay({ 
hoverEvent: function(){ 
$(".s1").attr("class","s2"); 
that.attr("class","s1"); //感谢“type23”提供了绑定对象方法 
$(this).attr("class","s1"); 
} 
}); 
}else{ 
that.hoverDelay({ 
outDuring: 1000, 
hoverEvent: function(){ 
$("#tm").show(); 
}, 
outEvent: function(){ 
$("#tm").hide(); 
} 
}); 
} 
});

唉,惭愧,代码就这样,没什么技术含量的,希望对有用的有用吧。“更多”的下拉鼠标移出后1000毫秒后下拉框隐藏。

基本上都是代码在撑页面,说点有用的东西吧。

hoverDelay方法共四个参数,表示意思如下:

hoverDuring       鼠标经过的延时时间
outDuring          鼠标移出的延时时间
hoverEvent        鼠标经过执行的方法
outEvent         鼠标移出执行的方法

Javascript 相关文章推荐
jQuery基本过滤选择器使用介绍
Apr 18 Javascript
jquery 获取表单元素里面的值示例代码
Jul 28 Javascript
使用jQuery制作Web页面遮罩层插件的实例教程
May 26 Javascript
jQuery事件绑定方法学习总结(推荐)
Nov 21 Javascript
JavaScript 获取元素在父节点中的下标(推荐)
Jun 28 Javascript
AngularJS遍历获取数组元素的方法示例
Nov 11 Javascript
vue 动态修改a标签的样式的方法
Jan 18 Javascript
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
Jun 07 Javascript
layui 实现加载动画以及非真实加载进度的方法
Sep 23 Javascript
微信小程序wxml列表渲染原理解析
Nov 27 Javascript
javascript实现前端成语点击验证优化
Jun 24 Javascript
JavaScript实现复选框全选功能
Apr 11 Javascript
jquery使用jxl插件导出excel示例
Apr 14 #Javascript
js 获取input点选按钮的值的方法
Apr 14 #Javascript
js生成动态表格并为每个单元格添加单击事件的方法
Apr 14 #Javascript
Js实现动态添加删除Table行示例
Apr 14 #Javascript
js实现网页倒计时、网站已运行时间功能的代码3例
Apr 14 #Javascript
PHP开发者必须掌握的6个关键字
Apr 14 #Javascript
javascript中的括号()用法小结
Apr 14 #Javascript
You might like
微盾PHP脚本加密专家php解密算法
2020/09/13 PHP
apache和PHP如何整合在一起
2015/10/12 PHP
php实现面包屑导航例子分享
2015/12/19 PHP
详解PHP执行定时任务的实现思路
2015/12/21 PHP
ASP.NET jQuery 实例3 (在TextBox里面阻止复制、剪切和粘贴事件)
2012/01/13 Javascript
JS实现网页背景颜色与select框中颜色同时变化的方法
2015/02/27 Javascript
Jquery uploadify上传插件使用详解
2016/01/13 Javascript
JavaScript兼容性总结之获取非行间样式案例
2016/08/07 Javascript
原生JS实现几个常用DOM操作API实例
2017/01/19 Javascript
vuejs2.0子组件改变父组件的数据实例
2017/05/10 Javascript
JavaScript中使用Async实现异步控制
2017/08/15 Javascript
bootstrap fileinput实现文件上传功能
2017/08/23 Javascript
vue指令只能输入正数并且只能输入一个小数点的方法
2018/06/08 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
Nodejs把接收图片base64格式保存为文件存储到服务器上
2018/09/26 NodeJs
详解Vue组件之间通信的七种方式
2019/04/14 Javascript
对layui数据表格动态cols(字段)动态变化详解
2019/10/25 Javascript
浅析vue-router实现原理及两种模式
2020/02/11 Javascript
vue实现户籍管理系统
2020/05/29 Javascript
Node.js API详解之 dgram模块用法实例分析
2020/06/05 Javascript
js前端传json后台接收‘‘被转为quot的问题解决
2020/11/12 Javascript
Bootstrap FileInput实现图片上传功能
2021/01/28 Javascript
[56:12]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第一场 6.3
2018/06/04 DOTA
Pythont特殊语法filter,map,reduce,apply使用方法
2016/02/27 Python
Python嵌套式数据结构实例浅析
2019/03/05 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
pandas 强制类型转换 df.astype实例
2020/04/09 Python
pandas的resample重采样的使用
2020/04/24 Python
印度民族服装购物网站:BIBA
2019/08/05 全球购物
Myprotein中国网站:欧洲畅销运动营养品牌
2021/02/11 全球购物
国际经济贸易专业推荐信
2013/11/06 职场文书
《识字五》教学反思
2014/03/01 职场文书
2015年教师学期工作总结
2015/04/30 职场文书
工作收入证明范本
2015/06/12 职场文书
Netty分布式客户端处理接入事件handle源码解析
2022/03/25 Java/Android
Apache Kafka 分区重分配的实现原理解析
2022/07/15 Servers