- 浏览: 1465510 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
luhouxiang:
写的很不错,学习了
Extjs 模块化动态加载js实践 -
kingkongtown:
如果想改成淘宝后台那样,可以在编辑器批量上传图片呢?
kissy editor 阶段体会 -
317966578:
兄弟我最近也在整jquery和caja 开放一些接口。在git ...
caja 原理 : 前端 -
liuweihug:
Javascript引擎单线程机制及setTimeout执行原 ...
setTimeout ,xhr,event 线程问题 -
辽主临轩:
怎么能让浏览器不进入 文档模式的quirks模式,进入标准的
浏览器模式与文本模式
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 每个像素的变化都会导致触发,可用定时器来减缓提高性能。
- mouseenter.zip (37.2 KB)
- 下载次数: 21
发表评论
-
模块化高扩展性的前端框架 KISSY
2013-03-14 14:58 8634模块化高扩展性的前端框架 KISSY 注:本文为 2 ... -
构建前端 DSL
2012-10-11 22:10 5372目前在传统的软件开 ... -
KISSY kisses bootstrap navbar
2012-08-03 01:12 6058看了下 bootstrap 的导航菜单,立刻非常喜欢,注意是浅 ... -
promise api 与应用场景
2012-02-07 17:34 7402promise 是 commonjs 社区中提出的异步规范,其 ... -
unified event model
2011-10-14 23:02 1790为了处理原生事件在各 ... -
转载:瀑布流布局浅析
2011-09-29 19:02 2853简介 如果你经 ... -
cross domain request
2011-09-29 18:39 2852场景 跨域请求是随着 ... -
基于多继承的树设计
2011-09-18 03:42 2271分类 树是一种常见 ... -
caja 原理 : 前端
2011-09-01 16:48 7077作为前端开放的基础安全保证,caja 是目前比较合 ... -
ie 下 cloneNode 导致的属性克隆
2011-08-24 16:10 2483这个还是很值得记下,一直存在的很大隐患终于解决,由于在 ie& ... -
just another event model
2011-06-08 20:47 2173事件模型也算是客户端兼容性的一个长期问题,早期 jquery ... -
框架 build 系统介绍
2010-07-11 01:29 1664一个复杂的类库通常都包括很多子模块( jquery@git ... -
querySelectorAll 探讨
2010-07-01 22:35 5245随着css selector engine在越来越多的java ... -
再谈 attribute
2010-06-22 11:37 2683@slideshare 原生: ... -
事件机制探讨
2010-06-21 13:54 2247由于浏览器事件机制的不兼容性,譬如最常见的注册事件差异 ... -
利用Attribute重构:业务与UI分离
2010-06-08 16:54 1593很简单的一个应用 通过按钮来限制输入范围 ,这样的话再 ... -
yui3 loader的串行加载特性
2010-06-04 12:30 1818yui3 的沙箱机制可以在 ... -
yui3下的load事件触发
2010-06-01 13:31 3250以前的一些总结:页面l ... -
理解YUI3 extension:Base.create
2010-05-31 03:01 2008YUI3中为了避免不必要的类继承层次,以及摆脱利用原型链模拟的 ... -
google WebFont Loader 源码阅读
2010-05-22 01:04 2789资料: 关于新发 ...
相关推荐
`mouseenter`和`mouseleave`是两个在IE浏览器中可用,但在其他非IE浏览器中可能不直接支持的事件。本文将详细讲解如何为非IE浏览器添加这些事件,并通过一个示例文件`testpage.html`进行说明。 `mouseenter`和`...
为了在非IE浏览器中实现`mouseenter`和`mouseleave`事件,可以采用事件委托的方式,即在一个共同的父元素上监听事件,并根据`target`和`currentTarget`属性来判断事件是从哪个子元素触发的。此外,也可以通过比较...
而 `compareDocumentPosition` 方法是跨浏览器实现类似功能的一个强大工具,它能帮助我们判断节点间的包含关系,以实现 `mouseenter` 和 `mouseleave` 的兼容性模拟。在处理复杂的用户交互和事件监听时,了解并运用...
例如,可以为非IE浏览器提供一个备用样式,通过条件注释或检测浏览器类型来实现。 4. **JavaScript修复**:有时,可以通过JavaScript来修复这个问题。例如,可以在元素的onmouseover事件处理程序中添加一段代码,以...
4. **事件处理**:为了响应用户的交互,如点击、鼠标移动等,我们需要覆盖或添加相应的事件处理函数,如`MouseEnter`, `MouseLeave`, `Click`等。 5. **样式和皮肤**:为了使按钮看起来像IE,可能需要模拟IE的按钮...
10. **事件处理**:WPF控件支持各种事件,如Click、MouseEnter等。开发者可以通过事件处理程序来响应用户的操作,实现交互逻辑。 11. **兼容性和适配**:虽然IE7样式可能只适用于特定的场景或用户群,但开发者需要...
mouseenter事件只在鼠标指针进入元素内部时触发一次,而mouseleave事件则在鼠标指针离开元素时触发一次。这样就避免了事件冒泡带来的重复触发问题。 2. 在老版本浏览器中,可以使用JavaScript代码来判断事件的目标...
- `mouseEnter`函数是一个高阶函数,它接收一个函数作为参数,返回一个新的函数。这个新函数会检查鼠标指针是否真的离开了当前元素(通过检查`relatedTarget`属性)。 - `isAChildOf`函数用于检查一个元素是否是另一...
JavaScript部分,我们通常会使用jQuery的事件处理函数,如`mouseenter`和`mousemove`,来控制预览图的行为。当鼠标进入图片区域,预览图显现;随着鼠标移动,通过计算鼠标相对于图片的位置,更新预览图的位置和缩放...
对于鼠标悬停效果,可以在`.image-container`上添加`mouseenter`和`mouseleave`事件: ```javascript $('.image-container').on('mouseenter mouseleave', function(event) { var action = event.type === '...
为了在IE7-9中实现兼容,可能需要使用`.mouseenter()`和`.mouseleave()`替代,因为IE7不支持`.hover()`。 ```javascript $('#navMenu li').hover(function() { $(this).addClass('shaking'); shake(); }, ...
当鼠标移到滚动元素上时,会触发`mouseenter`事件,此时代码会暂停滚动;当鼠标离开时,触发`mouseleave`事件,滚动效果会恢复。这是通过调用jQuery的`.stop()`和`.delay()`方法实现的。`.stop()`用于立即停止当前...
3. **jQuery选择器**:使用jQuery选择器找到所有的标题元素,然后为它们绑定`mouseenter`和`mouseleave`事件。这两个事件分别在鼠标进入和离开元素时触发。 4. **事件处理**:在事件处理函数中,我们根据当前元素的...
在实现过程中,主要涉及到两个关键的jQuery事件:mouseenter和mouseleave。当鼠标进入主菜单项时,触发mouseenter事件,显示对应的子菜单;当鼠标离开主菜单项或子菜单时,触发mouseleave事件,隐藏子菜单。此外,还...
在`mouseenter`事件的回调函数中,我们可以获取到鼠标的位置,计算出需要放大的图片部分,然后创建一个新的图片元素(或者改变已有的放大容器的背景图),并设置为放大后的图片部分。放大比例可以根据需求自定义。 ...
`contains`方法在不同的浏览器中有不同的实现,例如在IE中是`contains`方法,而在Firefox中则是`compareDocumentPosition`方法。因此,在跨浏览器开发时可能需要相应的兼容性处理代码。 在JQuery中,事件处理与原生...
这可能涉及到监听鼠标事件(如`mouseenter`和`mouseleave`),以及使用`.slideToggle()`或`.fadeIn()`等方法来实现动画效果。例如: ```javascript $('#menu li').on('mouseenter', function() { $(this).find('....