jQuery中多个元素的Hover事件解决方案


Posted in Javascript onJune 12, 2014

1.需求简介

jQuery的hover事件只是针对单个HTML元素,例如:

$('#login').hover(fun2, fun2);

当鼠标进入#login元素时调用fun1函数,离开时则调用fun2函数,这种API已能够满足绝大部分需求。

不过,有些时候我们希望当鼠标进入两个或多个元素时触发fun1,离开他们时触发fun2,而在这些元素间移动鼠标并不触发任何事件。例如两个元素紧挨着的HTML元素,如下图:

jQuery中多个元素的Hover事件解决方案 

当鼠标进入二者的区域时触发fun1,离开时触发fun2。你也许会想到使用下面的方式

$('#trigger, #drop'),hover(fun1, fun2);

这种方式并不能满足我们的需求,因为从#trigger进入#drop时会触发fun2和fun1。要解决这个问题,一种比较简单的方式是更改HTML结构,实现方式如下:
<div id="container"> 
<div id="trigger"></div> 
<div id="drop"></div> 
</div> $('#container').hover(fun1, fun2);

这样通过在父元素上绑定hover事件来实现此功能。

2.示例研究

下图为常见的下拉菜单简化图,HTML结构如下:

jQuery中多个元素的Hover事件解决方案 

ul id="#nav"> 
<li></li> 
<li></li> 
<li id="droplist"> 
<span>下拉菜单</span> 
<ul> 
<li>下拉项1</li> 
<li>下拉项2</li> 
<li>下拉项3</li> 
<ul> 
</li> 
<li></li> 
</ul>

实现的JavaScrip程序也是非常简单
$('#droplist').hover(function(){ 
$(this).find('ul').show(); 
}, function(){ 
$(this).find('ul').hide(); 
});

这种实现方式逻辑清晰,但导致HTML嵌套层级过多,书写CSS时出现了许多不便。例如:
#nav li { font-size:14px; }

我们希望这段CSS为第一层li元素设置14像素字体,但是其也作用于了第二层元素,所以不得不使用下面的语句改写过来
#nav li li { font-size:12px; }

3.解决方案

更改HTML结构

<ul id="#nav"> 
<li></li> 
<li></li> 
<li id="trigger">下拉菜单</li> 
<li></li> 
</ul> 
<ul id="drop"> 
<li>下拉项1</li> 
<li>下拉项2</li> 
<li>下拉项3</li> 
<ul>

依次引入JS文件
<script type="text/javascript" src="js/jquery.js"></script> 
<script type="text/javascript" src="js/jquery.mixhover.js"></script>

控制代码
$.mixhover( 
'#trigger', 
'#drop', 
function(trg, drop){ 
#(drop).show(); 
}, 
function(trg, drop){ 
#(drop).hide(); 
} 
)

这样当鼠标进入#trigger时将#drop显示出来,鼠标从#trigger移如#drop时不会触发任何事件,实际上就是讲#trigger和#drop元素当做一个元素来处理。

jquery.mixhover.js程序如下

/** 
* Author: http://rainman.cnblogs.com/ 
* Date: 2014-06-06 
* Depend: jQuery 
*/ 
$.mixhover = function() { 
// 整理参数 $.mixhover($e1, $e2, handleIn, handleOut) 
var parms; 
var length = arguments.length; 
var handleIn = arguments[length - 2]; 
var handleOut = arguments[length - 1]; 
if ($.isFunction(handleIn) && $.isFunction(handleOut)) { 
parms = Array.prototype.slice.call(arguments, 0, length - 2); 
} else if ($.isFunction(handleOut)) { 
parms = Array.prototype.slice.call(arguments, 0, length - 1); 
handleIn = arguments[length - 1]; 
handleOut = null; 
} else { 
parms = arguments; 
handleIn = null; 
handleOut = null; 
} // 整理参数 使得elements依次对应 
var elems = []; 
for (var i = 0, len = parms.length; i < len; i++) { 
elems[i] = []; 
var p = parms[i]; 
if (p.constructor === String) { 
p = $(p); 
} 
if (p.constructor === $ || p.constructor === Array) { 
for (var j = 0, size = p.length; j < size; j++) { 
elems[i].push(p[j]); 
} 
} else { 
elems[i].push(p); 
} 
} 
// 绑定Hover事件 
for (var i = 0, len = elems[0].length; i < len; i++) { 
var arr = []; 
for (var j = 0, size = elems.length; j < size; j++) { 
arr.push(elems[j][i]); 
} 
$._mixhover(arr, handleIn, handleOut); 
} 
}; 
$._mixhover = function(elems, handleIn, handleOut) { 
var isIn = false, timer; 
$(elems).hover(function() { 
window.clearTimeout(timer); 
if (isIn === false) { 
handleIn && handleIn.apply(elems, elems); 
isIn = true; 
} 
}, 
function() { 
timer = window.setTimeout(function() { 
handleOut && handleOut.apply(elems, elems); 
isIn = false; 
}, 10); 
}); 
};
Javascript 相关文章推荐
Javascript之旅 对象的原型链之由来
Aug 25 Javascript
js获取图片大小的函数代码
Sep 20 Javascript
详解强大的jQuery选择器之基本选择器、层次选择器
Feb 07 Javascript
jQuery选择器之基本选择器与层次选择器
Mar 03 Javascript
高性能JavaScript DOM编程(1)
Aug 11 Javascript
javascript巧用eval函数组装表单输入项为json对象的方法
Nov 25 Javascript
基于cssSlidy.js插件实现响应式手机图片轮播效果
Aug 30 Javascript
KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定
Oct 11 Javascript
几行js代码实现自适应
Feb 24 Javascript
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
Jun 20 Javascript
vuex根据不同的用户权限展示不同的路由列表功能
Sep 20 Javascript
JavaScript 对象创建的3种方法
Nov 17 Javascript
js获取当前页面的url网址信息
Jun 12 #Javascript
jquery 3D 标签云示例代码
Jun 12 #Javascript
javascript面向对象特性代码实例
Jun 12 #Javascript
如何让浏览器支持jquery ajax load 前进、后退功能
Jun 12 #Javascript
js创建一个input数组并绑定click事件的方法
Jun 12 #Javascript
javascript实现阻止iOS APP中的链接打开Safari浏览器
Jun 12 #Javascript
jQuery实现复选框全选/取消全选/反选及获得选择的值
Jun 12 #Javascript
You might like
PHP正则提取不包含指定网址的图片地址的例子
2014/04/21 PHP
讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
2007/04/12 Javascript
js用闭包遍历树状数组的方法
2014/03/19 Javascript
鼠标移到图片上变大显示而不是放大镜效果
2014/06/15 Javascript
JS实现让访问者自助选择网页文字颜色的方法
2015/02/24 Javascript
详解JavaScript数组的操作大全
2015/10/19 Javascript
详解javascript实现瀑布流列式布局
2016/01/29 Javascript
Node.js刷新session过期时间的实现方法推荐
2016/05/18 Javascript
Bootstrap编写导航栏和登陆框
2016/05/30 Javascript
详解Angular中的自定义服务Service、Provider以及Factory
2017/04/22 Javascript
Bootstrap fileinput文件上传预览插件使用详解
2017/05/16 Javascript
详解Vue使用命令行搭建单页面应用
2017/05/24 Javascript
React Native第三方平台分享的实例(Android,IOS双平台)
2017/08/04 Javascript
基于JavaScript实现带数据验证和复选框的表单提交
2017/08/23 Javascript
js导出Excel表格超出26位英文字符的解决方法ES6
2017/11/15 Javascript
基于jquery.page.js实现分页效果
2018/01/01 jQuery
js构造函数创建对象是否加new问题
2018/01/22 Javascript
JavaScript寄生组合式继承原理与用法分析
2019/01/11 Javascript
vuex的使用和简易实现
2021/01/07 Vue.js
JavaScript 实现继承的几种方式
2021/02/19 Javascript
Mac在python3环境下安装virtualwrapper遇到的问题及解决方法
2019/07/09 Python
将Pytorch模型从CPU转换成GPU的实现方法
2019/08/19 Python
Python实现TCP通信的示例代码
2019/09/09 Python
python实现银行管理系统
2019/10/25 Python
在Keras中实现保存和加载权重及模型结构
2020/06/15 Python
Python爬虫实现HTTP网络请求多种实现方式
2020/06/19 Python
1688平价精选商城:阿里集团旗下,工厂出厂价格直销
2017/04/24 全球购物
大学本科生的个人自我评价
2013/12/09 职场文书
竞选演讲稿范文
2013/12/28 职场文书
毕业生自荐信格式
2014/03/07 职场文书
总经理助理的职责
2014/03/14 职场文书
优秀少先队工作者事迹材料
2014/05/13 职场文书
维修工先进事迹
2014/05/29 职场文书
公司开业庆典策划方案
2014/06/04 职场文书
课内比教学心得体会
2014/09/09 职场文书
感谢信格式范文
2015/01/22 职场文书