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 相关文章推荐
学习YUI.Ext第五日--做拖放Darg&amp;Drop
Mar 10 Javascript
js文件中调用js的实现方法小结
Oct 23 Javascript
js 判断checkbox是否选中的实现代码
Nov 23 Javascript
js的正则test,match,exec详细解析
Jan 29 Javascript
对Jquery中的ajax再封装,简化操作示例
Feb 12 Javascript
JavaScript闭包详解
Feb 02 Javascript
微信小程序 跳转传递数据的实例
Jul 06 Javascript
使用jQuery实现购物车结算功能
Aug 15 jQuery
Element-UI Table组件上添加列拖拽效果实现方法
Apr 14 Javascript
vue+Vue Router多级侧导航切换路由(页面)的实现代码
Dec 20 Javascript
JavaScript实现手机号码 3-4-4格式并控制新增和删除时光标的位置
Jun 02 Javascript
微信小程序入门之指南针
Oct 22 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+oracle 分页类
2006/10/09 PHP
基于数据库的在线人数,日访问量等统计
2006/10/09 PHP
Yii遍历行下每列数据的方法
2016/10/17 PHP
PHP两种实现无级递归分类的方法
2017/03/02 PHP
PHP中str_split()函数的用法讲解
2019/04/11 PHP
5 cool javascript apps
2007/03/24 Javascript
JavaScript表格常用操作方法汇总
2015/04/15 Javascript
如何用javascript计算文本框还能输入多少个字符
2015/07/29 Javascript
javascript实现连续赋值
2015/08/10 Javascript
jQuery+html5+css3实现圆角无刷新表单带输入验证功能代码
2015/08/21 Javascript
JavaScript判断DIV内容是否为空的方法
2016/01/29 Javascript
微信小程序 Record API详解及实例代码
2016/09/30 Javascript
详解利用Angular实现多团队模块化SPA开发框架
2017/11/27 Javascript
JSON数据中存在单个转义字符“\”的处理方法
2018/07/11 Javascript
JQuery使用属性addClass、removeClass和toggleClass实现增加和删除类操作示例
2019/11/18 jQuery
[05:29]2014DOTA2国际邀请赛 赛后专访:LGDNewbee顺利过关
2014/07/13 DOTA
Python中的sort()方法使用基础教程
2017/01/08 Python
Python实现的双色球生成功能示例
2017/12/18 Python
python学习基础之循环import及import过程
2018/04/22 Python
python 读取txt中每行数据,并且保存到excel中的实例
2018/04/29 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
2018/05/18 Python
Python列表list常用内建函数实例小结
2019/10/22 Python
基于Python实现签到脚本过程解析
2019/10/25 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
python利用后缀表达式实现计算器功能
2021/02/22 Python
HTML5中的Scoped属性使用实例
2014/04/23 HTML / CSS
美国家用电器和电子产品商店:Abt
2016/09/06 全球购物
Sofft鞋官网:世界知名鞋类品牌
2017/03/28 全球购物
杭州联环马网络笔试题面试题
2013/08/04 面试题
JPA的特点
2014/10/25 面试题
小学生常见病防治方案
2014/06/06 职场文书
材料专业大学毕业生自荐书
2014/07/02 职场文书
文案策划专业自荐信
2014/07/07 职场文书
先进基层党组织主要事迹材料
2015/11/03 职场文书
通过Python把学姐照片做成拼图游戏
2022/02/15 Python
Python 图片添加美颜效果
2022/04/28 Python