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 相关文章推荐
?牟┛途W扣了一??效果出?? target=
May 27 Javascript
浅析JavaScript中的typeof运算符
Nov 30 Javascript
实例说明为什么不要行内使用javascript
Apr 18 Javascript
当前流行的JavaScript代码风格指南
Sep 10 Javascript
使用js复制链接中的部分文字的方法
Jul 30 Javascript
实例讲解JS中setTimeout()的用法
Jan 28 Javascript
基于jQuery的网页影音播放器jPlayer的基本使用教程
Mar 08 Javascript
ES5 ES6中Array对象去除重复项的方法总结
Apr 27 Javascript
JavaScript使用FileReader实现图片上传预览效果
Mar 27 Javascript
axios简单实现小程序延时loading指示
Jul 30 Javascript
JavaScript实现图片合成下载的示例
Nov 19 Javascript
vue实现登录功能
Dec 31 Vue.js
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
我的论坛源代码(三)
2006/10/09 PHP
php 正则匹配函数体
2009/08/25 PHP
解析Linux下Varnish缓存的配置优化
2013/06/20 PHP
PHP连接MySQL查询结果中文显示乱码解决方法
2013/10/25 PHP
PHP $O00OO0=urldecode &amp; eval 解密,记一次商业源码的去后门
2020/09/13 PHP
Firefox div高度自适应
2009/04/28 Javascript
基于jQuery的可用于选项卡及幻灯的切换插件
2011/03/28 Javascript
jquery中ajax学习笔记一
2011/10/16 Javascript
jquery 操作DOM案例代码分享
2012/04/05 Javascript
JS预览图像将本地图片显示到浏览器上
2013/08/25 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
2015/10/30 Javascript
jQuery获取radio选中项的值实例
2016/06/18 Javascript
vue.js学习之vue-cli定制脚手架详解
2017/07/02 Javascript
JavaScript输出所选择起始与结束日期的方法
2017/07/12 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
JS基础之逻辑结构与循环操作示例
2020/01/19 Javascript
Node在Controller层进行数据校验的过程详解
2020/08/28 Javascript
详解python中requirements.txt的一切
2017/03/03 Python
解决pycharm界面不能显示中文的问题
2018/05/23 Python
使用Python和Prometheus跟踪天气的使用方法
2019/05/06 Python
python logging模块的使用总结
2019/07/09 Python
解决django中ModelForm多表单组合的问题
2019/07/18 Python
Python使用matplotlib绘制三维参数曲线操作示例
2019/09/10 Python
python 实现快速生成连续、随机字母列表
2019/11/28 Python
python 实现单通道转3通道
2019/12/03 Python
TensorFlow tf.nn.max_pool实现池化操作方式
2020/01/04 Python
pandas处理csv文件的方法步骤
2020/10/16 Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
2020/10/31 Python
SNIDEL官网:日本VIVI杂志人气少女第一品牌
2020/03/12 全球购物
PHP面试题集
2016/12/18 面试题
移动通信专业自荐信范文
2013/11/12 职场文书
《桥》教学反思
2014/04/09 职场文书
社区戒毒工作方案
2014/06/04 职场文书
高一军训口号
2015/12/25 职场文书
2019年干货:自我鉴定
2019/03/25 职场文书
《鲁滨逊漂流记》之六读后感(4篇)
2019/09/29 职场文书