分享一个jquery插件,弥补一下hover事件的小小不足
hover事件有一个缺点:当你的鼠标无意划过一个dom元素(瞬间划过,这个时候用户可能不想触发hover事件),会触发hover事件
应该设置一个时差来控制hover事件的触发
比如jd左边的菜单 你用鼠标瞬间划过他子菜单会弹出然后立即消失, 用户体验非常的不好.
易迅的菜单就没有这个问题
delayHover来解决这个问题
啥也不说了先看调用…………………………
调用方式:
var duration = 500;// 延迟500毫秒
$('#div1').delayHover(function () {
$(this).css('background', '#ccc');
}, function () {
$(this).css('background', '#000');
}, duration)
duration表示延迟多少时间来触发hover事件
实现原理
设置一个定时器来开启hover事件
上代码
$.fn.delayHover = function (fnOver, fnOuter, duration) {
var _this = this
var timerOut; //开启hover的定时器
$(this).hover(function () {
timerOut = setTimeout(function () {
fnOver.call(_this);
}, duration)
}, function () {
clearTimeout(timerOut)
fnOuter.call(_this);;
})
}
fnOver开启一个定时器
fnOuter关闭定时器
bug修复:
1.fnOuter每次都会执行(即使fnOver不执行)
2.duration对传入的值进行安全监测
; (function ($) {
$.fn.delayHover = function (fnOver, fnOut, duration) {
var _this = this;
var timeouter;
var defaultDuration = 500;//默认500 毫秒
var fnOver_Running = false; //函数已经执行
//重置duration
if (typeof duration != "number" ||//不是字符串
isNaN(duration) || //NaN
duration < 0) { //非法值
duration = defaultDuration;
}
$(_this).hover(function (event) {
timeouter = setTimeout(function () {
fnOver_Running = true;
fnOver.call(_this, event)
}, duration);
}, function (event) {
clearTimeout(timeouter);
if (fnOver_Running) {
fnOver_Running = false;
fnOut.call(_this, event);
}
});
return $(this);
}
})(jQuery);
完整代码
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script> <style>
.hover {
background: #000;
color: #fff;
}
</style> <script>
; (function ($) { $.fn.delayHover = function (fnOver, fnOut, duration) {
var _this = this;
var timeouter;
var defaultDuration = 500;//默认500 毫秒
var fnOver_Running = false; //函数已经执行 //重置duration
if (typeof duration != "number" ||//不是字符串
isNaN(duration) || //NaN
duration < 0) { //非法值 duration = defaultDuration;
} $(_this).hover(function (event) {
timeouter = setTimeout(function () {
fnOver_Running = true;
fnOver.call(_this, event)
}, duration);
}, function (event) {
clearTimeout(timeouter);
if (fnOver_Running) {
fnOver_Running = false;
fnOut.call(_this, event);
}
});
return $(this);
} })(jQuery);
</script> <script>
$(function () { $('#hovertest').hover(function () {
console.log('指向');
$(this).addClass('hover');
},
function () {
console.log('离开');
$(this).removeClass('hover');
}); $('#delayHover').delayHover(function () {
console.log('指向'); $(this).addClass('hover');
}, function () {
console.log('离开');
$(this).removeClass('hover');
}, 500); $('#delayHover1').delayHover(function () {
console.log('指向');
$(this).addClass('hover');
}, function () {
console.log('离开');
$(this).removeClass('hover');
}, 3000);
})
</script> </head>
<body>
<h1>
hover事件有一个缺点:不能延时显示<br />
<i>delayHover</i>解决了这个问题
</h1> <div id="hovertest" style="border:1px solid #ccc; ">
这个是hover事件 指向我看看效果
</div> <div id="delayHover" style="margin-top:100px;">
这个是delayHover事件 指向我看看效果 默认值500毫秒
</div> <div id="delayHover1" style="">
这个是delayHover事件 指向我看看效果 延迟3000毫秒
</div>
</body>
</html>
欢迎提bug
分享一个jquery插件,弥补一下hover事件的小小不足的更多相关文章
- 你真的需要一个jQuery插件吗
jQuery的插件提供了一个很好的方法,节省了时间和简化了开发,避免程序员从头开始编写每个组件.但是,插件也将一个不稳定因素引入代码中.一个好的插件节省了无数的开发时间,一个质量不好的插件会导致修复错 ...
- Jquery 类似新浪微博,鼠标移到头像,用浮动窗口显示用户信息,已做成一个jquery插件
请注意!!!!! 该插件demo PHP 的 demo下载 C#.NET的demo下载 需要如下图, 1.鼠标移动到头像DIV时,Ajax获取数据,并让浮动DIV显示出来. 2.鼠标可以移动到上面浮 ...
- 做了一个jquery插件,使表格的标题列可左右拉伸
示例下载 插件名称命名为:jquery.tableresize.js,代码如下: /* Writen by mlcactus, 2014-11-24 这是我封装的一个jquery插件,能够使table ...
- 如何写一个jquery插件
本文总结整理一下如何写一个jquery插件?虽然现今各种mvvm框架异常火爆,但是jquery这个陪伴我们成长,给我们带来很多帮助的优秀的库不应该被我们抛弃,写此文章,作为对以往欠下的笔记的补充, ...
- 分享一个JQuery弹出层插件
JQuery插件TipsWindown 1.1 一个基于jQuery的弹出层.支持拖拽,支持内容为文字,图片,URL等!至于兼容性.在IE6下,弹出对像无法绝对固定.其他应该没啥大问题: 最新更新:( ...
- 开发一个jQuery插件——多级联动菜单
引言 开发中,有好多地方用到联动菜单,以前每次遇到联动菜单的时候都去重新写,代码重用率很低,前几天又遇到联动菜单的问题,总结了下,发现可以开发一个联动菜单的功能,以后想用的时候就方便多了.项目中每个页 ...
- 我的第一个jquery插件:下拉多选框
<!DOCTYPE HTML> <html> <head> <title> New Document </title> <meta n ...
- 如何去定义一个jquery插件
扩展jquery的时候.最核心的方法是以下两种: $.extend(object) 可以理解为jquery添加一个静态方法 $.fn.extend(object) 可以理解为jquery实例添加一个方 ...
- 自己实现一个jQuery插件
<script src="https://cdn.staticfile.org/jquery/2.0.3/jquery.min.js"></script> ...
随机推荐
- TTL的具体含义
TTL(Time To Live)生存时间值,在IP数据包从源到目的的整个转发路径上,每经过一个路由器,路由器都会修改这个TTL字段值,具体的做法是把该TTL的值减1,然后再将IP包转发出去.如果在I ...
- Java网络编程和NIO详解4:浅析NIO包中的Buffer、Channel 和 Selector
Java网络编程与NIO详解4:浅析NIO包中的Buffer.Channel 和 Selector 转自https://www.javadoop.com/post/nio-and-aio 本系列文章首 ...
- hdu 3694 10 福州 现场 E - Fermat Point in Quadrangle 费马点 计算几何 难度:1
In geometry the Fermat point of a triangle, also called Torricelli point, is a point such that the t ...
- JBOSS context root 项目名字默认不写
进到 %JBOSS_HOME%/configuration/standalone.xml,修改下面节点 <virtual-server name="localhost" en ...
- 网络编程I/O函数介绍
read和write #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); ssize_t write(in ...
- java.io.File中的 pathSeparator 与separator 的区别
先总的说一下区别: File.pathSeparator指的是分隔连续多个路径字符串的分隔符,例如: java -cp test.jar;abc.jar HelloWorld 就是指“;” ...
- 虚函数不应该是inlined(More Effective C++ 笔记)
在实际运行中,虚函数所需的代价与内联函数有关. 实际上虚函数不能是内联的. 这是因为“内联”是指“在编译期间用被调用的函数体本身来代替函数调用的指令,” 但是虚函数的“虚”是指“直到运行时才能知道要调 ...
- # 20155327 2016-2017-4 《Java程序设计》第8周学习总结
20155327 2016-2017-4 <Java程序设计>第7周学习总结 教材学习内容总结 了解NIO NIO使用频道(Channel)来衔接数据节点,在处理数据时,NIO可以让你设定 ...
- java面试Linux常用命令使用方法大全
1.# 表示权限用户(如:root),$ 表示普通用户 开机提示:Login:输入用户名 password:输入口令 用户是系统注册用户成功登陆后,可以进入相应的用户环境. 退出当前s ...
- HDU 4123 Bob’s Race(RMQ)
题意是说给出一棵树,N(10^5)个顶点,以及每条边的权值,现在需要选择连续的K个点(顶点编号连续),可以被选出来的条件是: 若d[i]代表顶点i到树上其他点的距离的最大值,使得区间[a, b]的d值 ...