`
yiminghe
  • 浏览: 1460235 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

mouseenter 的非 IE 实现

阅读更多

Extjs 实现

 

关于 mouseenter : 当第一次鼠标进入节点区域时触发,以后在节点区域内(子节点间)移动 时不触发。

属于 ie 的特有事件,貌似不是 w3c 标准 ,但是很有用。


extjs 3.0 对 非ie浏览器实现了这个事件,原理很简单 , 监控 mouseover 事件,只不过 当判断只是内部移动的话(触发自内部子节点冒泡过来的 ),就把该事件屏蔽掉,不再调用用户处理函数。以及利用 事件的标准属性 (IE 没有) currentTarget ,具体看见:


extjs 3.0 ext-base-debug.js 1946 行 。


这里 用 extjs 2.2.1 模拟一下 3.0 的实现。


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>mouseenter测试</title>


<script type="text/javascript" src="ext-base.js"></script>
<script type="text/javascript" src="ext-core.js"></script>


<script type="text/javascript">
//<![CDATA[

window.consoleH={
	log:function(str){
		Ext.get("log").update(Ext.get("log").dom.innerHTML+"<br/>"+str);
		Ext.get("log").dom.scrollTop=Ext.get("log").dom.scrollHeight;
	}
};
Ext.onReady(function() {
	
	var no=1;
	
	if(Ext.isIE) {
		
		alert("你可以利用 mouseenter 事件");
		Ext.get("t1").on("mouseenter",function(be){
			consoleH.log(no++ + " : enter inside currentTarget");
		});
	
	}else {
	
		Ext.get("t1").on("mouseover",function(be){
			consoleH.log(no++ + " :----------------");
			
			//事件发生的节点
			if(be.getTarget()) consoleH.log("target - "+be.getTarget().id);
			else consoleH.log("target - null");
				
			
			//事件处理的当前节点	
			if(be.browserEvent.currentTarget) consoleH.log("currentTarget - "+be.browserEvent.currentTarget.id);
			else consoleH.log("currentTarget - null");
				
				
			//从哪个节点移到事件发生的节点	
			if(be.getRelatedTarget())consoleH.log("related - "+be.getRelatedTarget().id);
			else consoleH.log("getRelatedTarget - null");
			
			
			if(be.browserEvent.currentTarget)	{
				
				//如果相关节点是处理节点的子节点,或者就是处理节点 ,不是第一次进入了,属于内部移动
				if(be.browserEvent.currentTarget == be.getRelatedTarget() || Ext.get(be.browserEvent.currentTarget).contains(be.getRelatedTarget()))
					consoleH.log("  moveinside currentTarget");
				else
				//恩,是第一次	
					consoleH.log("enter inside currentTarget");
			}
		
		});
		
	 }

       
});
//]]>

</script>

</head>
<body>
	
	<div id="log" style="position:absolute;right:0;height:400px;width:300px;border:1px solid red;overflow:scroll;">
</div>
<div style="width:400px;height:400px;border:1px solid green;" id="t1">


<div style="width:200px;height:200px;border:1px solid red;" id="t2">

<div style="width:100px;height:100px;border:1px solid black;" id="t3">



</div>

</div>

</div>

</body>
</html>
 



同理可实现  mouseleave 事件。

 

 

 

jquery 实现:

 

思路类似,判断当前触发节点是否是自己的子节点,是的话就忽略了 !

 

// Checks if an event happened on an element within another element
// Used in jQuery.event.special.mouseenter and mouseleave handlers
var withinElement = function(event) {
    // Check if mouse(over|out) are still within the same parent element
    var parent = event.relatedTarget;
    // Traverse up the tree
    while (parent && parent != this)
    try {
        parent = parent.parentNode;
    }
    catch(e) {
        parent = this;
    }

    //这里判断 this 吧
    if (parent != this) {
        // set the correct event type
        event.type = event.data;
        // handle event if we actually just moused on to a non sub-element
        jQuery.event.handle.apply(this, arguments);
    }
};

 

鼠标系列总结:


mousedown mouseup 的发生节点可能不一样,在a节点上mousedown,然后挪动鼠标在b节点上mouseup,则a节点上触发事件 mousedown,b节点上触发事件 mouseup,故对于拖放 mouseup 应绑定在 document 上面,而不是拖放节点。

mouseover,mouseout 可能会有一些想不到的效果,比如内部嵌套节点的mouseover,mouseout 事件会冒泡到主节点的事件处理器,并不是自己想要的效果,可以根据target以及relatedTarget来判断

mousemove 每个像素的变化都会导致触发,可用定时器来减缓提高性能。

 

分享到:
评论

相关推荐

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

    `mouseenter`和`mouseleave`是两个在IE浏览器中可用,但在其他非IE浏览器中可能不直接支持的事件。本文将详细讲解如何为非IE浏览器添加这些事件,并通过一个示例文件`testpage.html`进行说明。 `mouseenter`和`...

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

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

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

    而 `compareDocumentPosition` 方法是跨浏览器实现类似功能的一个强大工具,它能帮助我们判断节点间的包含关系,以实现 `mouseenter` 和 `mouseleave` 的兼容性模拟。在处理复杂的用户交互和事件监听时,了解并运用...

    IE应用了filter后mouseover事件异常

    例如,可以为非IE浏览器提供一个备用样式,通过条件注释或检测浏览器类型来实现。 4. **JavaScript修复**:有时,可以通过JavaScript来修复这个问题。例如,可以在元素的onmouseover事件处理程序中添加一段代码,以...

    IE风格按钮制作PB源码

    4. **事件处理**:为了响应用户的交互,如点击、鼠标移动等,我们需要覆盖或添加相应的事件处理函数,如`MouseEnter`, `MouseLeave`, `Click`等。 5. **样式和皮肤**:为了使按钮看起来像IE,可能需要模拟IE的按钮...

    C# WPF IE7样式控件

    10. **事件处理**:WPF控件支持各种事件,如Click、MouseEnter等。开发者可以通过事件处理程序来响应用户的操作,实现交互逻辑。 11. **兼容性和适配**:虽然IE7样式可能只适用于特定的场景或用户群,但开发者需要...

    javascript中mouseover、mouseout使用详解

    mouseenter事件只在鼠标指针进入元素内部时触发一次,而mouseleave事件则在鼠标指针离开元素时触发一次。这样就避免了事件冒泡带来的重复触发问题。 2. 在老版本浏览器中,可以使用JavaScript代码来判断事件的目标...

    javascript 兼容FF的onmouseenter和onmouseleave的代码

    - `mouseEnter`函数是一个高阶函数,它接收一个函数作为参数,返回一个新的函数。这个新函数会检查鼠标指针是否真的离开了当前元素(通过检查`relatedTarget`属性)。 - `isAChildOf`函数用于检查一个元素是否是另一...

    jQuery仿淘宝商品详情页图片放大镜效果,支持IE6及以上

    JavaScript部分,我们通常会使用jQuery的事件处理函数,如`mouseenter`和`mousemove`,来控制预览图的行为。当鼠标进入图片区域,预览图显现;随着鼠标移动,通过计算鼠标相对于图片的位置,更新预览图的位置和缩放...

    jquery实现图片墙

    对于鼠标悬停效果,可以在`.image-container`上添加`mouseenter`和`mouseleave`事件: ```javascript $('.image-container').on('mouseenter mouseleave', function(event) { var action = event.type === '...

    jQuery抖动导航菜单效果,兼容IE789及其它主流浏览器

    为了在IE7-9中实现兼容,可能需要使用`.mouseenter()`和`.mouseleave()`替代,因为IE7不支持`.hover()`。 ```javascript $('#navMenu li').hover(function() { $(this).addClass('shaking'); shake(); }, ...

    文字无缝滚动效果代码(jQuery),鼠标经过停下,鼠标移走继续滚动。兼容ie6及主流浏览器

    当鼠标移到滚动元素上时,会触发`mouseenter`事件,此时代码会暂停滚动;当鼠标离开时,触发`mouseleave`事件,滚动效果会恢复。这是通过调用jQuery的`.stop()`和`.delay()`方法实现的。`.stop()`用于立即停止当前...

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

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

    米柚网jQ下拉菜单栏.zip

    在实现过程中,主要涉及到两个关键的jQuery事件:mouseenter和mouseleave。当鼠标进入主菜单项时,触发mouseenter事件,显示对应的子菜单;当鼠标离开主菜单项或子菜单时,触发mouseleave事件,隐藏子菜单。此外,还...

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

    在`mouseenter`事件的回调函数中,我们可以获取到鼠标的位置,计算出需要放大的图片部分,然后创建一个新的图片元素(或者改变已有的放大容器的背景图),并设置为放大后的图片部分。放大比例可以根据需求自定义。 ...

    JavaScript和JQuery的鼠标mouse事件冒泡处理

    `contains`方法在不同的浏览器中有不同的实现,例如在IE中是`contains`方法,而在Firefox中则是`compareDocumentPosition`方法。因此,在跨浏览器开发时可能需要相应的兼容性处理代码。 在JQuery中,事件处理与原生...

    jquery实现右侧水平弹出菜单

    这可能涉及到监听鼠标事件(如`mouseenter`和`mouseleave`),以及使用`.slideToggle()`或`.fadeIn()`等方法来实现动画效果。例如: ```javascript $('#menu li').on('mouseenter', function() { $(this).find('....

Global site tag (gtag.js) - Google Analytics