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

mouseover和mouseout的BUG

    博客分类:
  • js
阅读更多

dunhuangmi的话:记得还是生手时面过某知名公司,题目之一是两个嵌套div,鼠标走对角线经过父与子时究竟会触发几个mouseover和mouseout事件?我当时答错了 ,下面这篇文章解释了这个问题。

===================================================================

描述

javascript的mouseover和mouseout事件,在绑定元素内部有子元素的情况下,

经过绑定元素时会多次触发mouseover和mouseout事件。

原因

当鼠标经过或离开子元素的时候,浏览器认为这样也触发了mouseover和mouseout事件

解决办法:

原生javascript:
(修改自jquery)

    var handler = document.getElementById("test2");
    handler.onmouseover = function(e){
            if(checkFather(this,e)){
                console.debug("over");
            }
    }
    handler.onmouseout = function(e){
            if(checkFather(this,e)){
                console.debug("out");
            }
    }
    function checkFather(that,e){
        var parent = e.relatedTarget;
         try {
            while ( parent && parent !== that ) {
                parent = parent.parentNode;
            }
            return (parent !== that);
        } catch(e) { }
    }

原理是判断离开的元素(mouseover时)或者进入的元素(mouseout进入的元素)是不是事件绑定对象本身或者子元素

jquery解决办法:

jquery的mouseenter和mouseleave方法已经修复了这个问题,可以直接用来替代mouseover和mouseout

不过有个mouseenter和mouseleave有个小问题是,让鼠标从文档外直接进入绑定事件的元素时,mouseenter不生效

暂时解决办法是,别让绑定事件的元素靠浏览器边缘,尽量留出至少1px间距。

另外,jquery的hover()方法,相当于使用了mouseenter和mouseleave。也能解决mouseover和mouseout的问题。

来自:http://www.zhangsuoyong.com/?p=111

 

先了解一下鼠标移动流程,鼠标放上去onmouseover下拉菜单出现,移开onmouseout则消失,从父元素到子元素流程事件触发流程应该是这样的:父onmouseover=>父onmouseout=>子onmouseover...
在 这个过程中有个javascript冒泡的问题,当从父元素移动到子元素的时候,会冒泡到父元素从而触发父元素的onmouseout事件,虽然从界面上 看鼠标并没有移出父元素。所以我们不要冒泡到父元素就行了。纯js的做法就是判断当前元素是否是子元素,是的话,就不冒泡到父元素。
你这里用到 了 jQuery的slideDown,使用mouseout时,鼠标只要在容器里一移动,就被触发了hide(),其实是因为mouseout事件也会影响 到子元素,也就是事件可能被同时绑定到了该容器的子元素上,所以鼠标移出每个子元素也都会触发我们的hide()。
jquery1.3版本还有个函数mouseleave,把mouseout换为mouseleave就解决了这个问题。

 

分享到:
评论

相关推荐

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

    通常,hover事件结合了mouseover和mouseout两个动作。然而,在旧版本的Internet Explorer(IE)浏览器中,使用hover事件时可能会遇到一个问题,即鼠标快速移动到触发下拉菜单时,菜单项会不停闪烁。这通常是由于...

    基于JavaScript的三维地图程序(仿e都市gis)

    1.增加建筑物高亮显示(还需完成鼠标mouseover和mouseout事件) 2009-8-18 1.完成建筑物高亮显示,有点小bug 2009-8-19 1.增加记录原始缩放比例的全局变量 2.解决建筑物高亮显示bug 2009-8-20 1.增加三维全景展示...

    jquery-2.1.1

    除了click之外,还有诸多其他事件,如mouseover、mouseout、keydown等,大大简化了跨浏览器的事件处理。 动画效果是jQuery吸引人的特点。`fadeIn()`、`slideUp()`、`slideDown()`等方法让动态效果的实现变得轻松...

    分享有关jQuery中animate、slide、fade等动画的连续触发、滞后反复执行的bug

    此问题主要出现在动画方法连续触发时,例如当快速连续触发鼠标事件如mouseover和mouseout时,动画可能会出现卡顿、重复执行或不按预期结束的情况。 在上述文件内容中,开发者提到了在实现鼠标悬停显示效果时,使用...

    javascript教材

    常见的事件有`click`、`mouseover`、`mouseout`等,通过事件处理函数,我们可以为每个事件定义相应的操作。 3. **窗口对象**:全局的`window`对象是JavaScript中的顶级对象,它包含了浏览器的所有功能,如`window....

    美观实用-带按钮轮播图

    5. **事件处理**:轮播图的暂停与继续滚动功能是通过监听鼠标的`mouseover`和`mouseout`事件来实现的。当鼠标进入轮播图区域,暂停自动轮播;当鼠标离开,恢复自动轮播。 6. **CSS样式**:轮播图的美观离不开CSS的...

    jquery评星插件

    5. **事件处理**:插件提供了多种事件回调函数,如`click`、`mouseover`和`mouseout`,允许开发者在用户与星星交互时执行特定的代码逻辑,如保存评分数据或显示提示信息。 ### 使用步骤 1. **引入jQuery库**:首先...

    jQuery1.3中文手册.rar

    3. **事件处理(Event Handling)**:jQuery的事件处理函数如`click()`, `mouseover()`, `mouseout()`等简化了JavaScript的事件绑定。`bind()`, `unbind()`, 和 `live()`(在1.7版本后被`on()`取代)用于动态绑定和...

    jQuery1.8~1.11全套加帮助文档

    3. **事件处理(Events)**:jQuery简化了事件绑定和解绑,`click()`, `mouseover()`, `mouseout()`等方法对应各种事件。`$(document).ready()`用于页面加载完成后执行函数,`$(window).load()`则在所有资源加载完毕...

    jQuery1.11.0

    `click()`, `mouseover()`, `mouseout()`等方法可以方便地绑定事件处理函数,而`.on()`方法则支持动态绑定事件,提高了代码的灵活性。同时,`trigger()`可以触发已绑定的事件。 在jQuery1.11.0中,动画效果得到了...

    jquery 1.7 API

    jQuery 提供了一套简洁的事件绑定机制,如`click()`, `mouseover()`, `mouseout()`等。`on()`方法在1.7中成为主要的事件绑定方式,它能支持动态添加的元素的事件处理。 ```javascript $(document).on('click', '#...

    JQuery帮助文档

    `click()`, `mouseover()`, `mouseout()`等方法可以方便地绑定对应的事件,`$(document).ready()`则用于确保DOM加载完成后执行代码。 ### 二、jQuery动画 1. **基本动画**: jQuery的`fadeIn()`, `fadeOut()`, `...

    jquery.js+jquery.form.js 插件

    3. **事件处理**: 使用`.on()`方法可以绑定各种事件,如`click()`, `mouseover()`, `mouseout()`等,同时支持事件委托。 4. **动画效果**: jQuery的`.animate()`方法可以创建自定义动画效果,而`.fadeIn()`, `....

    jQuery1.8.3_中文使用手册

    `.click()`, `.mouseover()`, `.mouseout()`等简写方法可以方便地处理常见事件。1.8.3版中,事件处理更加优化,支持事件委托和命名空间。 4. **动画效果(Effects)**:jQuery的动画功能强大,`.fadeIn()`, `....

    jQuery1.41中文API文档

    - jQuery 提供了一致的事件处理方法,如 `click()`, `mouseover()`, `mouseout()` 等,使得绑定和解绑事件变得简单。`on()` 和 `off()` 方法则提供了更高级的事件处理控制。 4. **动画效果** - `animate()` 方法...

    jquery-3.5.1.7z

    `click()`, `mouseover()`, `mouseout()`等方法用于绑定事件,`off()`用于解除绑定。此外,`on()`方法可以实现动态事件绑定,处理动态添加到DOM的元素。 三、动画效果 jQuery的动画功能是其一大亮点。`fadeIn()`, ...

    jquery api

    3. **事件处理(Event Handling)**:jQuery简化了事件绑定,如`click()`, `mouseover()`, `mouseout()`等。使用`on()`方法可以同时绑定多个事件,例如`$("button").on("click", function() {...})`。 4. **链式...

    JQuery1.7,1.4API

    3. **事件处理(Event Handling)**:`click()`, `mouseover()`, `mouseout()`等方法可以绑定事件处理器。例如,`$("#button").click(function() { ... })`会监听按钮的点击事件。 4. **动画(Animations)**:...

Global site tag (gtag.js) - Google Analytics