`
zhouyrt
  • 浏览: 1172470 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

为非IE浏览器添加mouseenter,mouseleave事件

阅读更多

先了解几个事件对象属性

target 指事件源对象,点击嵌套元素最里层的某元素,该元素就是target。IE6/7/8对应的是srcElement。

currentTarget 指添加事件handler的元素本身,如el.addEventListener中el就是currentTarget。IE6/7/8没有对应属性,可在handler内使用this来替代如evt.currentTarget = this。

relativeTarget 指事件相关的元素,一般用在mouseover,mouseout事件中。IE6/7/8中对应的是fromElement,toElement。

 

mouseentermouseleave IE9中仍然支持,另见 Greg Reimer 的博文 Goodbye mouseover, hello mouseenter


mouseenter与mouseover区别在于:在元素内部移动时mouseenter不会触发。如下

<!DOCTYPE HTML>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
	<title>mouseerter与mouseover区别(IE下测试)</title>
</head>
<body>	
<div id="result" style="position:absolute;right:100px;top:5px;width:250px;height:400px;border:2px solid gray;overflow:auto;">	
</div>
<h3>1,鼠标在div[id=parent1]内部移动时也会触发mouseover事件</h3>
<div id="parent1" style="width:400px;border:1px solid gray;padding:5px;">
	<div id="child11" style="width:100px;height:100px;background:gold;float:left;">Child11</div>
	<div id="child12" style="width:100px;height:100px;background:gold;float:right;">Child12</div>
	<div style="clear:both;"></div>
</div>
<br/>
<h3>2,鼠标在div[id=parent2]内部移动时也不会触发mouseenter事件</h3>
<div id="parent2" style="width:400px;border:1px solid gray;padding:5px;">
	<div id="child21" style="width:100px;height:100px;background:gold;float:left;">Child21</div>
	<div id="child22" style="width:100px;height:100px;background:gold;float:right;">Child22</div>
	<div style="clear:both;"></div>
</div>

<script type="text/javascript">
	function on(el,type,fn){
		el.addEventListener ? el.addEventListener(type, fn, false) : el.attachEvent('on' + type, fn);
	}
	function $(id){
		return document.getElementById(id);
	}
	var p1 = $('parent1'),
		p2 = $('parent2');
	function fn(e){
		var d = document.createElement('div');
		d.innerHTML = e.type;
		$('result').appendChild(d);
	}
	on(p1,'mouseover',fn);
	on(p2,'mouseenter',fn);
</script>
<body>
</html>

 

了解了这三个属性的意义后,实现起来就简单了:

E = function(){
   function elContains(a, b){
		try{
			return a.contains ? a != b && a.contains(b) : !!(a.compareDocumentPosition(b) & 16);
		}catch(e){}
		
   }
	function addEvt(el, type, fn){
		function fun(e){
			var a = e.currentTarget, b = e.relatedTarget;
			if(!elContains(a, b) && a!=b){
				fn.call(e.currentTarget,e);
			}	
		}	
		if(el.addEventListener){
			if(type=='mouseenter'){					
				el.addEventListener('mouseover', fun, false);					
			}else if(type=='mouseleave'){
				el.addEventListener('mouseout', fun, false);
			}else{
				el.addEventListener(type, fn, false);
			}
		}else{
			el.attachEvent('on' + type, fn);
		}
	}	
	return {addEvt:addEvt};
}();
 

 

 

 

 

 

3
1
分享到:
评论
1 楼 liangrockman 2011-01-26  
文章不错,感谢分享!

相关推荐

    为非IE浏览器添加mouseenter,mouseleave事件的实现代码

    为了在非IE浏览器中实现`mouseenter`和`mouseleave`事件,可以采用事件委托的方式,即在一个共同的父元素上监听事件,并根据`target`和`currentTarget`属性来判断事件是从哪个子元素触发的。此外,也可以通过比较...

    跨浏览器的 mouseenter mouseleave 以及 compareDocumentPosition的使用说明

    由于mouseenter和mouseleave在非IE浏览器中不被支持,我们需要使用mouseover和mouseout来模拟这些事件,并通过compareDocumentPosition方法判断鼠标是否在目标元素内。在非IE浏览器中,compareDocumentPosition是一...

    javascript 兼容FF的onmouseenter和onmouseleave的代码

    `onmouseenter`和`onmouseleave`是IE浏览器最初支持的事件,它们帮助开发者处理了鼠标事件不冒泡的情况,从而更精确地控制事件的触发。在标签中提及的`firefox onmouseenter`表明了需要对Firefox浏览器进行兼容性...

    javascript中mouseover、mouseout使用详解

    这些事件由IE浏览器首先提出,而后被最新版本的其他主流浏览器支持。mouseenter事件只在鼠标指针进入元素内部时触发一次,而mouseleave事件则在鼠标指针离开元素时触发一次。这样就避免了事件冒泡带来的重复触发问题...

    javascript mouseover、mouseout停止事件冒泡的解决方案

    但在非IE浏览器(如Firefox、Chrome等)中,并没有直接对应的事件,需要通过其他方式来实现类似功能。 一种解决方案是利用W3C标准中的 `relatedTarget` 属性。`relatedTarget` 在 `mouseout` 事件中表示鼠标离开的...

    jQuery鼠标经过图片局部放大.zip

    使用jQuery的选择器找到图片元素,然后绑定`mouseenter`和`mouseleave`事件。`mouseenter`事件会在鼠标进入元素时触发,`mouseleave`事件则在鼠标离开时触发。这样可以确保在用户将鼠标移开时恢复原始状态。 3. **...

    Programming_Silverlight

    在早期版本中,Silverlight通过ActiveX控制来实现在IE浏览器中的集成。然而,随着技术的发展,HTML5的兴起,以及对跨平台支持的需求增加,ActiveX控制的使用逐渐减少。尽管如此,对于某些遗留系统或特定场景,了解...

    jQuery动态背景导航菜单

    5. **浏览器兼容性**:jQuery库本身已经做了良好的跨浏览器兼容处理,但在旧版本的IE浏览器中可能存在问题。确保你的jQuery版本是现代的,并且在项目中考虑使用如Modernizr这样的工具检测浏览器特性,以进行必要的...

    完美解决jQuery的hover事件在IE中不停闪动的问题

    这样的修改可以解决IE浏览器中的hover事件触发导致的菜单闪烁问题,提升了用户的交互体验。 此外,这种方法的实施也向我们展示了在进行Web开发时,选择合适事件的重要性。不同的事件有着不同的触发条件和行为特点,...

    jquery鼠标悬停导航下划线滑出效果.zip

    同时,考虑到不同设备和浏览器的兼容性,确保代码在主流浏览器中都能正常工作,可能需要对旧版本的IE浏览器进行额外的兼容性处理。 总之,“jQuery鼠标悬停导航下划线滑出效果”是一个简单而有效的增强网站导航体验...

    jquery实现图片墙

    例如,为页面加载后和窗口滚动事件添加回调函数: ```javascript $(document).ready(function() { // 页面加载后的初始处理 initImageWall(); // 滚动事件处理 $(window).scroll(function() { ...

    jQuery鼠标移动实现手风琴效果

    3. **jQuery选择器**:使用jQuery选择器找到所有的标题元素,然后为它们绑定`mouseenter`和`mouseleave`事件。这两个事件分别在鼠标进入和离开元素时触发。 4. **事件处理**:在事件处理函数中,我们根据当前元素的...

    jQuery实用导航上下滑动及左右切换效果demo

    首先,我们需要监听`mouseenter`和`mouseleave`事件,然后根据事件触发相应的滑动动画。 2. **左右切换效果**: 左右切换效果常见于水平导航菜单,尤其是当菜单项过多,无法在一行内完全显示时。我们可以使用`...

    jquery下拉竖导航菜单代码

    $('#vertical-nav &gt; li').on('mouseenter mouseleave', function(e) { var $this = $(this); if (e.type === 'mouseenter') { $this.find('.subnav').stop().slideDown(300); // 悬停时下拉二级菜单 } else { ...

    jquery实现右侧水平弹出菜单

    可能需要对旧版本的IE浏览器进行特殊处理,并考虑触摸设备的交互方式。 以上就是使用jQuery实现右侧水平弹出菜单的基本过程。实际项目中,你可能还需要结合响应式设计,使菜单在不同屏幕尺寸下都能良好显示。同时,...

    jQuery CSS3动态缩放焦点图代码,鼠标移动到缩略图上时,大图利用transform属性动态缩放。兼容主流浏览器

    3. **jQuery事件绑定**:使用jQuery的`mouseenter`和`mouseleave`事件监听用户鼠标进入和离开缩略图的行为。当鼠标悬停在缩略图上时,修改大图的transform属性,使大图缩放;当鼠标离开时,恢复原始大小。 4. **...

Global site tag (gtag.js) - Google Analytics