javascript(JS) 0基础快速入门 (七)(事件的冒泡、委托和绑定)

372 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

事件的冒泡

  • 所谓冒泡指的就是事件的向上传导
  • 后代元素上的事件被触发时,其祖先元素的相同事件也会被触发

类似于 给一个盒子绑定了鼠标点击事件,当点击了盒子后,该鼠标点击事件会一直往上触发

如果这盒子有个父级盒子,那么父级盒子的鼠标点击事件也会触发一直到window的鼠标点击事件上`

取消冒泡

event.cancelBuuble = true;

事件的委派

  • 指将事件统一绑定给元素共同的祖先元素,这样当后代元素上的事件触发时会一直冒泡到祖先元素
  • 因为后代没有设置点击事件,所以后代元素不会执行任何操作,祖先元素设置了祖先元素会执行对应操作
  • 事件的委派是利用了冒泡,通过委派可以减少事件的绑定的次数,提高程序的性能

给ul绑定一个单击响应函数,当点击子元素时ul的点击响应函数也会触发,这就是事件的委托

ul.onclick = function(event){

	// 判断当点击的时a标签时触发ul的函数

	// target 这个属性可以获取触发这个事件的对象
    // 给 a 标签添加blinkclass 类名用来绑定自身,不然点 ul 的哪个地方都可以触发事件

	var reg = /\blink\b/;

 	if(reg.test(event.target.className)){

 	alert("sad");

 	}

}

事件的绑定

  • 对象+事件 可以绑定一个对象绑定一个事件
  • 但是后边绑定相同的事件会被覆盖掉

addEventListener( )

  • 通过这个方法也可以为元素绑定响应函数
  • 参数
    • 1、 事件的字符串,不要on
    • 2、 回调函数,当事件触发时该函数会被调用
    • 3、 是否在捕获阶段触发事件,需要一个布尔值,一般传false ,默认不传就为false
btn1.addEventListener("click"  ,  function(){ }  ,  false);

使用addEventListener()可以同时为一个元素的相同事件同时绑定多个响应函数

当事件触发时,响应函数会按照函数的绑定顺序执行

示例:

<div id="box1" style="width: 100px; height: 100px; background-color: #bfa;"></div>
  <script>
    let box1 = document.getElementById('box1')
    box1.addEventListener('click',()=>{console.log('我是第一个函数点击事件');})
    box1.addEventListener('click',()=>{console.log('我是第二个函数点击事件');})
  </script>

image-20220220124246423

注意: 但是当使用,addEventListenr()方法绑定的函数时, 取消默认行为不能用return false

    // 可以使用event来取消

    // event.preventDefault();

事件委派的使用案例:

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.onload = function(){
        var btn1 = document.getElementById("btn1");
        var ul = document.getElementsByTagName("ul")[0];
        // 添加一个a标签
        btn1.onclick = function(){
            var a = document.createElement("li");
            a.innerHTML = "<li><a href='#' class='link'>超链接一</a></li>";
            ul.appendChild(a);
        }
        // 给ul绑定一个单击响应函数,当点击子元素时ul的点击响应函数也会触发,这就是事件的委托
            ul.onclick = function(event){
                // 判断当点击的时a标签时触发ul的函数
                // target 这个属性可以获取触发这个事件的对象
                var reg = /\blink\b/;
                if(reg.test(event.target.className)){
                    alert("sad");
                }
            }
        }
    </script>
</head>
<body>
    <button id="btn1">添加一个超链接</button>
    <ul>
        <li><a href="#" class="link sd" >超链接一</a></li>
        <li><a href="#" class="link" >超链接二</a></li>
        <li><a href="#" class="link" >超链接三</a></li>
    </ul>
</body>

image-20220220124416460

点击按钮添加一个新标签,并且利用 事件委派新标签也绑定了鼠标点击事件

image-20220220124446446


事件冒泡的使用示例:

实现一个鼠标在哪 box1 盒子就在哪的一个功能

给 window 绑定了鼠标移动事件后,当box1盒子移动到 box2 盒子中时,box2 的鼠标移动事件会触发

并一直冒泡到 window 的鼠标移动事件上,才会让 box1 一直能跟随鼠标移动

    <style>
        #box1{
            width: 100px;
            height: 100px;
            background-color: red;
            position: absolute;
        }
        body{
            height: 1000px;
        }
    </style>
    <script>
        window.onload = function(){
            // 获取box1
            var box1 = document.getElementById("box1");
            // 获取鼠标移动的坐标
            window .onmousemove = function(event){
                // var x = event.clientX;
                // var y = event.clientY;
                // 这种是相对于整个页面的偏移量,当滚动条移动时就会偏
                // 可以使用pageX,pageY来获取当前页面的坐标
                // document.documentElement  表示根标签
                var x = event.pageX;
                var y =event.pageY;
                box1.style.left = x+"px";
                box1.style.top = y+"px";
            }
        }
    </script>
</head>
<body>
    <div id="box1"></div>
    <div id="box2" style="width: 500px; height: 500px; background-color: #bfa; margin: 0 auto;"></div>
</body>

image-20220220124905279