jQuery hover 延时器实现代码


Posted in Javascript onMarch 12, 2011

例如:

$('#foo').slideUp(300).delay(800).fadeIn(400);// 在.slideUp() 和 .fadeIn()之间延时800毫秒。

hover是否可以设计一个延时器呢?答案是肯定的。延时操作目的是为了防止用户误触发事件,一般情况下鼠标指针小于150毫秒的停留时间都可以被忽略。其实,如果入侵delay全能让其作用在hover事件上,但是为了避免John Resig不断的折腾jQuery而导致兼容问题,还是老老实实的写标准插件比较好。
目标
继承jQuery API的优雅:jQuery(expression).mouseDelay(150).hover(over, out)
不得破坏jQuery原型链
上述目标看起来很帅气,实现起来却非常简单,仅仅十多行的代码我都不好意思拿来拼凑文章:
源代码
/*! 
* jQuery.mouseDelay.js v1.2 
* http://www.planeart.cn/?p=1073 
* Copyright 2011, TangBin 
* Dual licensed under the MIT or GPL Version 2 licenses. 
*/ 
(function ($, plugin) { 
var data = {}, id = 1, etid = plugin + 'ETID'; 
// 延时构造器 
$.fn[plugin] = function (speed, group) { 
id ++; 
group = group || this.data(etid) || id; 
speed = speed || 150; 
// 缓存分组名称到元素 
if (group === id) this.data(etid, group); 
// 暂存官方的hover方法 
this._hover = this.hover; 
// 伪装一个hover函数,并截获两个回调函数交给真正的hover函数处理 
this.hover = function (over, out) { 
over = over || $.noop; 
out = out || $.noop; 
this._hover(function (event) { 
var elem = this; 
clearTimeout(data[group]); 
data[group] = setTimeout(function () { 
over.call(elem, event); 
}, speed); 
}, function (event) { 
var elem = this; 
clearTimeout(data[group]); 
data[group] = setTimeout(function () { 
out.call(elem, event); 
}, speed); 
}); 
return this; 
}; 
return this; 
}; 
// 冻结选定元素的延时器 
$.fn[plugin + 'Pause'] = function () { 
clearTimeout(this.data(etid)); 
return this; 
}; 
// 静态方法 
$[plugin] = { 
// 获取一个唯一分组名称 
get: function () { 
return id ++; 
}, 
// 冻结指定分组的延时器 
pause: function (group) { 
clearTimeout(data[group]); 
} 
}; 
})(jQuery, 'mouseDelay');

API说明

方法 参数 说明
mouseDelay (speed, group) 速度, 设置延时分组名称 设置延时触发效果. 两个参数都是可选的
mouseDelayPause() [无] 冻结选定元素的延时器
jQuery.mouseDelay.pause (group) 延时分组名称 冻结指定分组的延时器
jQuery.mouseDelay.get () [无] 获取一个不重复的分组名
下载
演示 

http://demo.3water.com/js/2011/mouseDelay/index.htm

打包下载

planeArt.cn原创文章

Javascript 相关文章推荐
javascript编程起步(第五课)
Jan 10 Javascript
『jQuery』取指定url格式及分割函数应用
Apr 22 Javascript
Javascript中使用A标签获取当前目录的绝对路径方法
Mar 02 Javascript
jQuery添加和删除输入文本框标签代码
May 20 Javascript
jQuery简单动画变换效果实例分析
Jul 04 Javascript
关于动态生成dom绑定事件失效的原因及解决方法
Aug 06 Javascript
AngularJS递归指令实现Tree View效果示例
Nov 07 Javascript
jquery使用FormData实现异步上传文件
Oct 25 jQuery
vue实现按需加载组件及异步组件功能
May 27 Javascript
Layui表格行工具事件与数据回填方法
Sep 13 Javascript
浅谈vue中组件绑定事件时是否加.native
Nov 09 Javascript
vue 移动端记录页面浏览位置的方法
Mar 11 Javascript
js中if语句的几种优化代码写法
Mar 12 #Javascript
鼠标事件延时切换插件
Mar 12 #Javascript
autoIMG 基于jquery的图片自适应插件代码
Mar 12 #Javascript
再谈javascript图片预加载技术(详细演示)
Mar 12 #Javascript
在jQuery1.5中使用deferred对象 着放大镜看Promise
Mar 12 #Javascript
使用jquery插件实现图片延迟加载技术详细说明
Mar 12 #Javascript
Jquery.LazyLoad.js修正版下载,实现图片延迟加载插件
Mar 12 #Javascript
You might like
论坛头像随机变换代码
2006/10/09 PHP
PHP代码网站如何防范SQL注入漏洞攻击建议分享
2012/03/01 PHP
无刷新动态加载数据 滚动条加载适合评论等页面
2013/10/16 PHP
php判断手机访问还是电脑访问示例分享
2014/01/20 PHP
PHP实现的蚂蚁爬杆路径算法代码
2015/12/03 PHP
php处理复杂xml数据示例
2016/07/11 PHP
Laravel使用模型实现like模糊查询的例子
2019/10/24 PHP
jquery多浏览器捕捉回车事件代码
2010/06/22 Javascript
Prototype源码浅析 Number部分
2012/01/16 Javascript
多种方式实现JS调用后台方法进行数据交互
2013/08/20 Javascript
使用JavaScript实现连续滚动字幕效果的方法
2015/07/07 Javascript
JavaScript动态插入CSS的方法
2015/12/10 Javascript
Bootstrap创建可折叠的组件
2016/02/23 Javascript
分享jQuery网页元素拖拽插件
2020/12/01 Javascript
node.js中module.exports与exports用法上的区别
2016/09/02 Javascript
babel基本使用详解
2017/02/17 Javascript
self.attachevent is not a function的解决方法
2017/04/04 Javascript
Vue+Element使用富文本编辑器的示例代码
2017/08/14 Javascript
浅谈angular2路由预加载策略
2017/10/04 Javascript
基于jQuery实现的设置文本区域的光标位置
2018/06/15 jQuery
js全屏事件fullscreenchange 实现全屏、退出全屏操作
2019/09/17 Javascript
微信小程序实现轨迹回放的示例代码
2019/12/13 Javascript
[54:28]EG vs OG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
零基础写python爬虫之爬虫框架Scrapy安装配置
2014/11/06 Python
Python基于scrapy采集数据时使用代理服务器的方法
2015/04/16 Python
python中对数据进行各种排序的方法
2019/07/02 Python
python异步编程 使用yield from过程解析
2019/09/25 Python
python tkinter canvas使用实例
2019/11/04 Python
HTML5中的autofocus(自动聚焦)属性介绍
2014/04/23 HTML / CSS
请说出你所知道的线程同步的方法
2013/04/19 面试题
你对IPv6了解程度
2016/02/09 面试题
护士自荐信范文
2013/12/15 职场文书
三年级数学教学反思
2014/01/31 职场文书
2014年世界艾滋病日宣传活动总结
2014/11/18 职场文书
TypeScript 使用 Tuple Union 声明函数重载
2022/04/07 Javascript
Python selenium绕过webdriver监测执行javascript
2022/04/12 Python