分享一个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> ...
随机推荐
- angular大牛的博客
对angular的了解比亲娘还了解,http://each.sinaapp.com/angular/index.html 对angular比较深入的研究,这个人的所有博客都值得一看,这是7. http ...
- hdu——1873(优先队列)
看病要排队 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- 本地Run Page时报检测到意外的 URL 参数,它将被忽略。
经查,是因为我RUN的时候 Target URL -- http://MY-PC:8988/OA_HTML/runregion.jsp 将MY-PC更改为本地IP即可. 设置方法 Tools - Em ...
- 蓝桥杯练习系统历届试题 带分数 dfs
问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. 注意特征:带分数中,数字1~9分别出现且只出现一次( ...
- MHA-ATLAS-MySQL高可用2
六,配置VIP漂移 主机名 IP地址(NAT) 漂移VIP 描述 mysql-db01 eth0:192.168.0.51 VIP:192.168.0.60 系统:CentOS6.5(6.x都可以) ...
- String类的concat()方法
String类的concat()方法: public class MyClass { public static void main(String[] args) { String str1=&quo ...
- angular的中文文档在这里。。
链接 仿ant-design的 angular组件 echarts文档
- linux 模拟生成 CAN 设备
/************************************************************************************** * linux 模拟生成 ...
- 使用rollup 开发专业js library
rollup 是一个不错的javascript 模块打包器,一般我们用来构建library 安装 npm install -g rollup 参考集成jquey && shortid ...
- oracle计算两个日期的时间差时分秒
Oracle函数可以实现诸多的功能,下面就介绍使用oracle函数计算时间差的实现方法. 两个Date类型字段:START_DATE,END_DATE,计算这两个日期的时间差(分别以天,小时,分钟,秒 ...