首页 > 编程语言 >JavaScript事件冒泡和事件捕获

JavaScript事件冒泡和事件捕获

时间:2023-02-09 11:01:32浏览次数:37  
标签:触发 捕获 JavaScript li 冒泡 background 事件

阅读目录

总结

它是描述事件触发时序问题的术语。
事件捕获指的是从 document 到触发事件的那个节点,即自上而下的去触发事件。

相反的,事件冒泡是自下而上的去触发事件。

绑定事件方法的第三个参数,就是控制事件触发顺序是否为事件捕获。
true,事件捕获;
false,事件冒泡。
默认false,即事件冒泡。

1、事件冒泡是什么?

先 child,然后 parent。事件的触发顺序自内向外,这就是事件冒泡。

2、事件捕获是什么?

先 parent 然后 child。事件触发顺序变更为自外向内,这就是事件捕获。

3、如何在事件冒泡和事件捕获中切换?

绑定事件方法的第三个参数,就是控制事件触发顺序是否为事件捕获。
true,事件捕获;false,事件冒泡。默认false,即事件冒泡。

document.getElementById("parent").addEventListener("click",function(e){
                alert("parent事件被触发,"+e.target.id);
            },true);

4、如何实现鼠标放到li上对应的 li 背景变灰?

$("li").on("mouseover",function(){
   $(this).css("background-color","#ddd").siblings().css("background-color","white");
})

$("ul").on("mouseover",function(e){
   $(e.target).css("background-color","#ddd").siblings().css("background-color","white");
})
事件冒泡和事件捕获

听老师讲解事件冒泡和事件捕获机制的时候跟听天书一样,只依稀记得IE使用的是事件冒泡,其他浏览器则是事件捕获。

当时的我,把它当成IE浏览器兼容问题,所以没有深究(IE8以下版本的浏览器已基本退出市场)。工作至今,虽然多次遇到该类问题,但均未深究,始终一知半解,遇到了全TM靠猜(选A不行就选B呗)。今天闲来无事自己做了个 demo,算是把这个问题彻底搞明白了。

先上结论:

他们是描述事件触发时序问题的术语。事件捕获指的是从 document 到触发事件的那个节点,即自上而下的去触发事件。

相反的,事件冒泡是自下而上的去触发事件

绑定事件方法的第三个参数,就是控制事件触发顺序是否为事件捕获。

true,事件捕获;
false,事件冒泡。
默认false,即事件冒泡。

Jquery 的 e.stopPropagation 会阻止冒泡,意思就是到我为止,我的爹和祖宗的哪些事儿我就不管了。

HTML结构

<div id="parent" style="width: 100px;background-color: aliceblue;height: 50px;">
    <div id="child" class="child" style="width: 20px;background-color: antiquewhite;height: 20px;"></div>
</div>

<script>
// 现在我们给它们绑定上事件
document.getElementById("parent").addEventListener("click",function(e){
                alert("parent事件被触发,"+this.id);
            })

            document.getElementById("child").addEventListener("click",function(e){
                alert("child事件被触发,"+this.id)
            })
</script>

JavaScript事件冒泡和事件捕获_css
现在改变第三个参数的值为 true

document.getElementById("parent").addEventListener("click",function(e){
                alert("parent事件被触发,"+e.target.id);
            },true)
            
document.getElementById("child").addEventListener("click",function(e){
    alert("child事件被触发,"+e.target.id)
},true)

JavaScript事件冒泡和事件捕获_css_02
结论:
先 parent 然后 child。事件触发顺序变更为自外向内,这就是事件捕获。

需求:鼠标放到 li上对应的 li 背景变灰

利用事件冒泡实现

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>

<ul>
    <li>item1</li>
    <li>item2</li>
    <li>item3</li>
    <li>item4</li>
    <li>item5</li>
    <li>item6</li>
</ul>

<script>
// 利用事件冒泡实现
$("ul").on("mouseover",function(e){
    $(e.target).css("background-color","#ddd").siblings().css("background-color","white");
})
</script>

JavaScript事件冒泡和事件捕获_事件冒泡_03

直接给所有 li 都绑上事件也可以只要……

$("li").on("mouseover",function(){
    $(this).css("background-color","#ddd").siblings().css("background-color","white");
})

这样也行。而且从代码简洁程度上,两者是相若仿佛的。但是,前者少了一个遍历所有li节点的操作,所以在性能上肯定是更优的。

还有就是,如果我们在绑定事件完成后,页面又动态的加载了一些元素……

源码

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>事件冒泡</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>

<ul>
    <li>item1</li>
    <li>item2</li>
    <li>item3</li>
    <li>item4</li>
    <li>item5</li>
    <li>item6</li>
</ul>

<script>
$("<li>item7</li>").appendTo("ul");
$("li").on("mouseover",function(){
    $(this).css("background-color","#ddd").siblings().css("background-color","white");
})
</script>

</body>
</html>

这时候,第二种方案,由于绑定事件的时候item7还不存在,所以为了效果,我们还要给它再绑定一次事件。而利用冒泡方案由于是给ul绑的事件……

高下立判!

标签:触发,捕获,JavaScript,li,冒泡,background,事件
From: https://blog.51cto.com/u_13571520/6046077

相关文章

  • Css & JavaScript & jquery 实现选项卡的制作
    阅读目录Css源码源码解析JavaScript源码JavaScript源码解析jQuery源码jQuery源码解析Css源码<!DOCTYPEhtml><htmllang="en"><style></style>......
  • JavaScript 索引、关联、对象数组增删改查循环
    阅读目录索引数组增删改查循环关联数组增循环对象增删改查循环JavaScript中数组元素删除1、length2、delete关键字3、栈方法4、队列方法......
  • JavaScript 运算符数据类型
    阅读目录运算符1、自增运算符2、分别赋值3、求多次方4、js中逻辑运算符数据类型1、数据类型2、强制类型转换运算符1、自增运算符leta=11;aler......
  • JavaScript undefined 与 null 的区别
    阅读目录阐述一、相似性二、历史原因三、最初设计四、目前的用法null表示"没有对象",即该处不应该有值。典型用法是:undefined表示"缺少值",就是此处应该有一......
  • JavaScript 评测代码运行速度
    一、使用performance.now()API在JavaScript中,可以使用performance.now()API来评测代码的运行速度。该API返回当前页面的高精度时间戳,您可以在代码执行前后调用它......
  • C# 如何实现事件总线 EventBus
    事件总线知多少(1)源码路径:Github-EventBus事件总线知多少(1)事件总线知多少(2)1.引言事件总线这个概念对你来说可能很陌生,但提到观察者(发布-订阅)模式,你也许就很熟悉。......
  • kendo ui的treeView节点点击事件修改和grid的配置的一点总结
    kendo-ui的treeView节点(node)点击时 可以触发一个select的事件(event),并且连续点击多次相同节点,可以触发并且只能触发一次该事件。可是需求上需要实现:每次点击相同的节点,......
  • JavaScript类
    一、什么是js类类是创建对象的模板,使用class关键字,类体在大括号{}中,类体中我们可以写需要的属性、方法成员,其中每个类都包含一个特殊方法constructor()。它是类的构造函......
  • 从JavaScript到TypeScript,Flow与WebAssembly
    1、TypeScriptTypeScript是一种由微软开发的自由和开源的编程语言,它是JavaScript的一个超集,扩展了JavaScript的语法,主要提供了型别系统和对ES6的支持。TypeScript......
  • Web前端框架(JavaScript,CSS)、html组件、CSS规范与第三方库
    1、什么是前端框架前端框架一般指用于简化网页设计的框架,使用广泛的前端开发套件,比如,jquery,extjs,bootstrap等等,这些框架封装了一些功能,比如html文档操作,漂亮的各种控件(按钮,......