在写前端代码的时候经常会用到onmouseover 和 onmouseout事件。
如果触发事件的对象内容为单纯的文本,即:<div>comments</div>之类的元素则不会有什么问题。
但是如果在一些复杂的应用中,在对象中添加一些其他对象,即:<div><ul></ul><
/div>类型的则会出现很变态的问题。当鼠标移动到子对象上时,也会触发父对象的onmouseout事件,这显然会造成问题。如下图移过安徽或
者其他省份这个List_box 即消失 这显然不是我们想要的。
由于多次碰到这个问题了所以决定认真研究一下这个问题。
以下是收集的一些资料:
Alimama UED 对这个问题的讨论
http://ued.alimama.com/?p=51
从这里获得第一个解决方案的思路
http://topic.csdn.net/u/20080605/13/2fee4fbb-3b40-410b-8510-358818909063.html
从AS3的 target 和 currentTarget 属性获得的思路 (AS3 的核心和 js 是类似的)
http://space.flash8.net/space/?690727/action_viewspace_itemid_383030.html
我们先来看一下这个问题的原因:
网上并没有对这个问题的原因做出很完全的解释,但是可以肯定 在移动到子对象上时 浏览器已经判断为鼠标移出了父对象,即激活了onmouseout事件。这可能和js 事件层次有关,即每个对象都是可以加事件,这样必定会有事件的层次,这里就不深究了。
解决问题的主要困难:
如果不用框架来解决这个问题,将会碰到很多困难,首先对于onmouseout时间需要特殊的处理,而且对于不同的浏览器有不同的标准,这里当然包括臭名昭著的IE 和 大名鼎鼎的 Firefox。
我这里主要使用yui来解决这个问题,这样至少在一定程度上统一了浏览器的操作,简化了问题的解决。
这里有两个解决方法:
但是首先必须了解YUI的 YAHOO.util.Event.getRelatedTarget(e)方法和 YAHOO.util.Event.getTarget(e)方法
他其实对ie 和firfox的 currentTarget和target进行了封装 因为 ie和firfox 有着不同的event调用方法。
经过测试:
YAHOO.util.Event.getRelatedTarget(e) 返回的是鼠标从父对象移出,指向的子对象元素
YAHOO.util.Event.getTarget(e) 返回的是从一个子对象移到另一个对象时的子对象
基本思路是这样的当鼠标指向不包含在父对象里的子对象时 即肯定移除了父对象 则隐藏父对象
若子对象包含在父对象中不进行任何操作。
这里又会碰到一个问题 如何才能判断子对象是否包含在父对象中,在ie 下有contains方法 而在firfox 下是不支持的
第一种思路
来自(收集的第二篇文章
):重写HTMLElement的contains方法 由于仅firfox支持HTMLElement所以代码如下:
if(typeof(HTMLElement)!=”undefined”)
HTMLElement.prototype.contains=function(obj)
{
if(obj==this) return true;
while(obj=obj.parentNode) if(obj==this) return true;
return false;
}
这样 若在ie下即不会重写这个方法。
接着的代码:
var hideProvListBox = function(e,objName)
{
if(!this.contains(YAHOO.util.Event.getRelatedTarget(e))){
document.getElementById(objName).style.display = “none”;
}
}
YAHOO.util.Event.on(”p_idr_”,”mouseout”,hideProvListBox,”p_idr_”);
第二种思路
还是用YUI解决 因为我觉得这么成熟的YUI不可能会没有解决这个问题的办法。
翻了一会儿API 发现了Dom中的一个Region工具 咋看翻译成“区域”还是有点抽象的,啥时候js 和Region挂钩了
看了看简介,发现可以判断一个区域是否包含在另一个区域中,这下就有办法了呵呵。
代码如下:
var hideProvListBox = function(e,objName)
{
if(!YAHOO.util.Region.getRegion(this).contains(YAHOO.util.Region.getRegion(YAHOO.util.Event.getRelatedTarget(e)))){
document.getElementById(objName).style.display = “none”;
}
}
YAHOO.util.Event.on(”p_idr_”,”mouseout”,hideProvListBox,”p_idr_”);
好到此这个问题告一段落,不知到是否还有更好的办法,向各位赐教。
分享到:
相关推荐
### JavaScript 下关于 `onmouseout` 与事件冒泡的问题经验小结 ...无论是使用 jQuery 还是原生 JavaScript,都有多种方法可以解决由 `onmouseout` 事件引发的问题。希望本文能为您的开发工作带来帮助。
本文将深入探讨两个常见的鼠标事件:`onmouseover`和`onmouseout`,以及它们在不同浏览器中的行为差异,以及如何解决由此引发的问题。 `onmouseover`事件会在鼠标指针进入一个元素时触发,包括进入该元素的任何子...
然而,当元素内含有子元素时,`onmouseout`事件会受到事件冒泡的影响,导致事件在不应该触发的时候被触发,这在需要精确控制交互时会引发问题。 在本案例中,描述了一个具体的问题:当鼠标从一个`div`元素移入其...
这种方法通过自定义 `mouseleave` 事件处理器来解决 `onmouseout` 事件过度触发的问题。其核心思想是在 `onmouseout` 事件触发时检查目标元素与鼠标移入的新元素之间的关系,只有当鼠标移入的元素不是目标元素的后代...
鼠标离开事件(OnMouseOut) 鼠标离开事件是鼠标离开元素时引发的事件。 一般事件 除了上述事件外,还有许多其他的事件,例如:ondblclick、onkeypress、onkeydown、onkeyup等。 页面相关事件 页面相关事件包括:...
鼠标事件是指在 Web 浏览器中,用户通过鼠标交互引发的事件。这些事件可以被 JavaScript 捕获和处理,以实现各种交互效果。下面是常见的鼠标事件: 1. onClick:鼠标点击事件,多用在某个对象控制的范围内的鼠标...
这种模型避免了内联事件处理器与HTML混合的问题,允许通过指定函数名赋值来执行事件处理函数。同时也可以通过匿名函数直接触发对应的代码。 ##### DOM2模型 DOM2级事件模块是W3C标准,对各种事件提供了更加丰富的...
- 在动态绑定事件监听器时,尽量避免在事件处理函数中使用过多的DOM操作,因为每次事件触发时都可能会引起页面的重排(Reflow)和重绘(Repaint),从而影响性能。 总的来说,JavaScript动态设置鼠标事件是Web开发...
如果没有引发键盘事件,它的值为 0。 8. offsetX 和 offsetY offsetX 和 offsetY 属性用于获取鼠标相对于触发事件的对象的位置坐标。offsetX 检查水平坐标,而 offsetY 检查垂直坐标。 9. propertyName property...
- **事件驱动(Event Driver)**: 指由鼠标或热键引发的一系列程序行为。 - **事件处理程序(EventHandler)**: 专门用于处理特定事件的程序或函数。 ##### 1.2 JavaScript中的事件处理流程 事件处理流程主要包括两个...
- 不建议使用具体的版本号(如`language="javascript1.2"`),以免引起兼容性问题。 - 当使用`document.write()`方法输出`</script>`时,为了避免解析错误,可以使用字符串拼接或者转义字符的方法。 - 使用`defer...
这是通过监听`onmouseover`和`onmouseout`事件以及使用`setTimeout`和`clearTimeout`来实现的。以下是简化后的代码: ```javascript var oDiv1 = document.getElementById('div1'); var oDiv2 = document....
- 常见的事件处理程序有`onmouseover`, `onmouseout`, `onclick`等,它们都以"on"开头。 - 事件对象提供有关事件的信息,如坐标、按键状态等。 13. **定时器**: - `setTimeout` 和 `setInterval` 用于设定定时...
然后使用JavaScript的onmouseover和onmouseout事件来切换类,实现鼠标悬停时颜色变化。对于链接字变色,可以在中定义Alink、Avisited和A:hover的状态,分别对应未访问、已访问和鼠标悬停时的颜色。 3. 设置网页的...
事件是 Axure RP 中最基本的交互单元,包括 OnClick、OnMouseEnter、OnMouseOut、OnFocus、OnLostFocus、OnPageLoad 等。 十、场景和动作 场景和动作是 Axure RP 中的高级交互单元,通过组合事件和动作,设计者...
而在鼠标离开时,通过`onmouseout`事件恢复滚动,增强了交互性。 ### 实现细节 - **编码兼容性**:代码中的`;charset=gb2312"/>`表明了页面采用的是GB2312编码,这在早期网页开发中较为常见,但现代网页标准更倾向...
上述代码示例中使用了`onmouseover`和`onmouseout`两个事件来处理鼠标滑入和滑出菜单项时的显示和隐藏操作。 5. jQuery DOM操作:jQuery可以用来操作DOM元素的属性和样式。在上面的代码中,通过jQuery修改了子菜单...
为了确保兼容性和无障碍性,应考虑非鼠标用户,例如将`onmouseover`替换为`onfocus`,`onmouseout`替换为`onblur`等。 5. **HTTP请求原则**:GET请求不应引起不可逆的副作用,比如删除数据。同时,考虑到非鼠标用户...
需要注意的是,在实际应用中,我们可能还需要考虑浏览器兼容性、事件处理机制以及性能优化等问题。此外,代码示例中有一些错误和不完整的地方,需要根据实际需要进行调试和完善。 总之,通过本文介绍的方法,我们...
最后,通过 `document.write()` 生成一个包含多个列表项的div,每个列表项代表表格中的一行,具有不同的鼠标悬停事件(onmouseover 和 onmouseout)用于实现某种交互效果,如改变焦点或播放动画。 整个代码段展示了...