为什么在子元素上执行mousein时会触发mouseout?

用户名

来自MDNmouseout事件的定义为:

当将指针设备(通常是鼠标)从连接了侦听器的元素上移开或从其子元素上移开时,将触发mouseout事件。

因此,如果我有一个与之mouseout相连的容器div,那么我希望如果鼠标从其子级中的任何一个移出,就会触发该事件。但是我所看到的是,即使将鼠标移入了容器的孩子中,也是如此mouseout这是示例:

x = 0;
$(document).ready(function(){
    $("div.over").mouseout(function(){
        $(".over span").text(x += 1);
    });    
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="over" style="background-color:lightgray;padding:20px;width:250px;float:left">
  <h3 style="background-color:white;">Mouseout event triggered: <span></span></h3>
</div>

当鼠标输入时,h3触发mouseouton div.over为什么?

编辑:请提及权威参考以备份您的主张。

埃斯彭

由于您的div包含子项,因此您在“鼠标悬停”子项后就“拖出”了容器,这是设计使然。因为它在它自己的可见空间的外部,而在孩子的可见空间的内部。由于子级也位于父级内部,因此它“继承”了事件,因为该事件被视为单独的卷,但仍在父级空间内。这就是为什么在您“暂停”孩子时触发事件的原因。这称为“冒泡”,该事件使元素的族谱冒泡。

如Mahi所指出的,如果您使用“ mouseleave”,则仅当它离开附加元素的区域时才会触发。

MDN文档在此处解释了差异:https : //developer.mozilla.org/en-US/docs/Web/Events/mouseleave

但是权威的答案最好在W3C DOM规范中查看:

当指针设备从一个元素移动到其后代元素之一的边界时,必须分派它。

因此,它明确指出,将鼠标移到子元素之一上时必须触发事件mouseout。因此,发生这种情况的原因是根据设计和规范:

https://www.w3.org/TR/DOM-Level-3-Events/#event-type-mouseout

我添加了一个样本来显示差异

x = 0;
$(document).ready(function(){
    $("div.over").mouseout(function(e){
        $(".over span").text(x += 1);
        console.log(e.target);
    });    
    $("div.over > h3").mouseover(function(){
        $(".over > h3").css("color", "red");
    }).mouseout(function(){
        $(".over > h3").css("color","black");
    });
    
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="over" style="background-color:lightgray;padding:20px;width:250px;float:left">
  <h3 style="background-color:white;">Mouseout event triggered: <span></span></h3>
</div>

x = 0;
$(document).ready(function(){
    $("div.over").mouseleave(function(){
        $(".over span").text(x += 1);
    });    
    $("div.over > h3").mouseover(function(){
        $(".over > h3").css("color", "red");
    }).mouseout(function(){
        $(".over > h3").css("color","black");
    });
    
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="over" style="background-color:lightgray;padding:20px;width:250px;float:left">
  <h3 style="background-color:white;">Mouseout event triggered: <span></span></h3>
</div>

现在,如果将子元素在“ z-space”中向下移动,它将不再影响mouseout事件:

x = 0;
$(document).ready(function(){
    $("div.over").mouseout(function(){
        $(".over").css("background","red");
    }); 
    $("div.over").mouseover(function(){
        $(".over").css("background","#444");
    });       
    $("div.over > h3").css("display", "block");
    $("div.over > h3").css("position", "relative");
    $("div.over > h3").css("z-index", -1000);
    $("div.over > h3").mouseover(function(){
        $(".over > h3").css("color", "red");
    }).mouseout(function(){
        $(".over > h3").css("color","black");
    });
    
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="over" style="background-color:lightgray;padding:20px;width:250px;float:left">
  <h3 style="background-color:white;">Mouseout event triggered: <span></span></h3>
</div>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

与后代选择器绑定时,为什么在子元素之前的父元素上触发事件?

D3.js-为什么要为每个子元素触发mouseover和mouseout?

使用e.target时,为什么此点击事件在子元素上触发?

如何禁用由子元素触发的mouseout事件?

为什么Leaflet在mouseout事件上没有提供正确的relatedTarget元素?

拖动子元素时会触发父元素的“ dragleave”

为什么python子进程运行特定命令时会停止执行?

为什么执行此代码时会挂起?

即使事件由其子元素触发,如何仅在父元素上执行回调?

为什么pandas.apply()在null元素上执行?

为什么在常量(字符)上执行异或运算时,在使用变量时会以不同的方式工作

为什么CSS悬停时会在元素上添加重复边框?

当组件子组件被删除或添加时会触发什么钩子?

为什么在触发点击时会遇到太多递归?

为什么当鼠标不移动时会触发MouseMove事件

在子元素上反应onMouseEnter事件触发

在屏幕上绘制组件时会触发什么事件

为什么在 Linux 上通过 `bazel test` 执行的 drake 中基于 OpenGL 的 VTK 目标有时会失败?

在离开D3中的边界区域之前,将元素分组上的Mouseout触发

为什么在修改类的本地属性时会执行 ngOnChanges?

为什么在执行此查询时会出现此错误?

为什么我执行此代码时会打印inf?

为什么在尝试执行备份时会收到“代理错误”?

当事件变为“ true”时,为什么未在克隆的元素上触发我的JQuery函数?

在日期字段上执行匹配查询时会发生什么

fabric.js组中元素上的mouseover和mouseout事件未触发(mousedown和mouseup触发)

为什么 CSS 模块在处理 html 元素时会影响全局?

为什么内联元素在浮动时会接受宽度和高度?

为什么在使用cloneNode()时会重置<select>元素的值?