[转载 js] YUI解决mouseout事件冒泡的办法
2009-03-20 17:24
204 查看
原文出处:http://design.alibaba-inc.com/?q=node/727
========================================
YAHOO.util.Dom.isAncestor —— 给元素寻根问祖 查看
跟踪
周三, 02/13/2008 - 13:47 — 小马语法:
YAHOO.util.Dom.isAncestor(haystack, needle)
YAHOO.util.Dom.inDocument(el)
YUI的源码里使用 haystack(草堆) 和 needle(针) 作为参数名,体现了YUI开发人员的幽默感。look for a needle in a haystack 正是大海捞针的意思。
isAncestor() 方法用来判断 haystack 元素是否是 needle 元素的父节点。它在鼠标参与的一些交互中非常有用。
我们都知道 mouseover 和 mouseout 事件,它们不方便之处在于,当鼠标在容器上滑动时,可能多次触发 mouseover 和 mouseout 事件,这增加了我们编码的复杂度。
IE支持mouseenter 和 mouseleave 事件,它们只在鼠标移到或移出容器时才触发。但其他浏览器并不支持这两个事件。但是,使用 inAncestor() 方法可以帮助我们模拟实现。看下面的例子:
//HTML 结构<div id="demo-container"> <ul id="demo-ul"> <li id="child_1"><span><span><b><b>child 1</b></b></span></span></li> <li id="child_2"><span><span><b><b>child 2</b></b></span></span></li> <li id="child_3"><span><span><b><b>child 3</b></b></span></span></li> </ul></div><div id="msg"></div>//JS$E.onDOMReady(function() { var container = $('demo-container'); var msgbox = $('msg'); //模拟 mouseenter 事件 var mouseEnterHandler = function(ev) { //relatedTarget 在mouseover事件中指向鼠标从该处移过来的元素 var rt = $E.getRelatedTarget(ev); //如果rt 不是container本身,同时也不是container的子元素,那么就是 Enter 的情况 if (rt !== container && !$D.isAncestor(container, rt)) { msgbox.innerHTML += 'Entering ...'; } msgbox.innerHTML += 'Mouse Over ...'; } //模拟 mouseleave 事件 var mouseLeaveHandler = function(ev) { msgbox.innerHTML += 'Mouse Out ...'; //relatedTarget 在mouseout事件中指向鼠标移动到的元素 var rt = $E.getRelatedTarget(ev); //如果rt 不是container本身,同时也不是container的子元素,那么就是 Leave 的情况 if (rt !== container && !$D.isAncestor(container, rt)) { msgbox.innerHTML += 'Leaving ...'; } } $E.on(container, 'mouseover', mouseEnterHandler); $E.on(container, 'mouseout', mouseLeaveHandler);});
打开范例文件。
TBra 中的TB.widget.SimplePopup 组件正是采用了上例中的实现。
isAncestor() 方法还衍生 inDocument() 方法,该方法用来判断一个元素是否存在于DOM树中,其实它就是简单的调用 isAncestor() 方法,看它的源码:
/** * Determines whether an HTMLElement is present in the current document. * @method inDocument * @param {String | HTMLElement} el The element to search for * @return {Boolean} Whether or not the element is present in the current document */inDocument: function(el) { return this.isAncestor(document.documentElement, el);},
========================================
YAHOO.util.Dom.isAncestor —— 给元素寻根问祖 查看
跟踪
周三, 02/13/2008 - 13:47 — 小马语法:
YAHOO.util.Dom.isAncestor(haystack, needle)
YAHOO.util.Dom.inDocument(el)
YUI的源码里使用 haystack(草堆) 和 needle(针) 作为参数名,体现了YUI开发人员的幽默感。look for a needle in a haystack 正是大海捞针的意思。
isAncestor() 方法用来判断 haystack 元素是否是 needle 元素的父节点。它在鼠标参与的一些交互中非常有用。
我们都知道 mouseover 和 mouseout 事件,它们不方便之处在于,当鼠标在容器上滑动时,可能多次触发 mouseover 和 mouseout 事件,这增加了我们编码的复杂度。
IE支持mouseenter 和 mouseleave 事件,它们只在鼠标移到或移出容器时才触发。但其他浏览器并不支持这两个事件。但是,使用 inAncestor() 方法可以帮助我们模拟实现。看下面的例子:
//HTML 结构<div id="demo-container"> <ul id="demo-ul"> <li id="child_1"><span><span><b><b>child 1</b></b></span></span></li> <li id="child_2"><span><span><b><b>child 2</b></b></span></span></li> <li id="child_3"><span><span><b><b>child 3</b></b></span></span></li> </ul></div><div id="msg"></div>//JS$E.onDOMReady(function() { var container = $('demo-container'); var msgbox = $('msg'); //模拟 mouseenter 事件 var mouseEnterHandler = function(ev) { //relatedTarget 在mouseover事件中指向鼠标从该处移过来的元素 var rt = $E.getRelatedTarget(ev); //如果rt 不是container本身,同时也不是container的子元素,那么就是 Enter 的情况 if (rt !== container && !$D.isAncestor(container, rt)) { msgbox.innerHTML += 'Entering ...'; } msgbox.innerHTML += 'Mouse Over ...'; } //模拟 mouseleave 事件 var mouseLeaveHandler = function(ev) { msgbox.innerHTML += 'Mouse Out ...'; //relatedTarget 在mouseout事件中指向鼠标移动到的元素 var rt = $E.getRelatedTarget(ev); //如果rt 不是container本身,同时也不是container的子元素,那么就是 Leave 的情况 if (rt !== container && !$D.isAncestor(container, rt)) { msgbox.innerHTML += 'Leaving ...'; } } $E.on(container, 'mouseover', mouseEnterHandler); $E.on(container, 'mouseout', mouseLeaveHandler);});
打开范例文件。
TBra 中的TB.widget.SimplePopup 组件正是采用了上例中的实现。
isAncestor() 方法还衍生 inDocument() 方法,该方法用来判断一个元素是否存在于DOM树中,其实它就是简单的调用 isAncestor() 方法,看它的源码:
/** * Determines whether an HTMLElement is present in the current document. * @method inDocument * @param {String | HTMLElement} el The element to search for * @return {Boolean} Whether or not the element is present in the current document */inDocument: function(el) { return this.isAncestor(document.documentElement, el);},
相关文章推荐
- [转载 js] YUI解决mouseout事件冒泡的办法
- (转载)js(jquery)的on绑定点击事件执行两次的解决办法
- JS事件冒泡解决办法
- 完美解决js事件冒泡
- js添加事件、移除事件、阻止冒泡、阻止浏览器默认行为等写法(兼容IE/FF/CHROME) 转载
- JS调用form的方法submit直接提交form的时候,submit事件不响应解决办法
- JS中mouseup事件丢失的原因与解决办法
- 解决js中onMouseOut事件冒泡的问题
- jquery mouseout事件冒泡解决方法
- JS冒泡事件的快速解决方法
- js处理一个div里面多个点击事件时出现的事件冲突 重复的解决方法 事件冒泡
- 使用jquery的时候,js的window.onunload事件失效的解决办法
- js动态改变value 不触发onchange事件解决办法
- COCOS2D 事件冒泡规律 和 CCMenu一直响应事件的解决办法
- JS中使用for循环添加点击事件时,获取i值及参数异常原因及解决办法
- 【转载】utf-8编码引起js输出中文乱码的解决办法
- js中e.cancelBubble解决事件冒泡
- JS事件函数不能传参数的解决办法。
- 基于mouseout和mouseover等类似事件的冒泡问题解决方法
- 【转载】Js 冒泡事件阻止