JavaScript复习——04 事件

这篇具有很好参考价值的文章主要介绍了JavaScript复习——04 事件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

事件对象

事件对象是由浏览器在外面触发事件的时候创建的,这个对象封装了各种事件相关的各种信息

例如:

  1. 鼠标的位置
  2. 键盘的按键

浏览器创建事件对象后,会将事件对象作为响应参数传递
在DOM类型中有多种不同类型的事件对象,但是他们都一个祖先Event

  1. event.clientX:获取鼠标的X轴坐标
  2. event.clientY:获取鼠标的Y轴坐标
  3. event.target:表示触发事件的对象
  4. event.currentTarget:绑定事件的对象
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>DOM</title>
      <style>
          .box1 {
              width:300px;
              height:300px;
              background-color: #bfa;
          }
      </style>
  </head>
  <body>
      <div id="box1" class="box1">
          <div id="box2">
              
          </div>
      </div>
    <script>
        const box1 = document.getElementById("box1")
        const box2 = document.getElementById("box2")
        box1.onclick = function(event) {
			console.log(event.target)
            console.log(this)
        } 
        box2.onclick = function(event) {
			alert('我是box2')
        } 
    </script>
  </body>
</html>

事件冒泡

事件冒泡:当我们的元素上某个事件被触发(内部元素不一定要绑定事件)后,其祖先元素的相同事件也会被触发,冒泡大大的简化了我们代码的编写,但是在某些场景下,我们有时也不希望冒泡

  1. event.stopPropagation():取消事件传导
  2. event.preventDefault():取消事件的默认行为
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>DOM</title>
      <style>
          .box1 {
              width:300px;
              height:300px;
              background-color: #bfa;
          }
          #box {
              width:100px;
              height:100px;
              background-color: orange;
          }
      </style>
  </head>
  <body>
      <div id="box1" class="box1">
          <div id="box2">
              
          </div>
      </div>
    <script>
        const box1 = document.getElementById("box1")
        const box2 = document.getElementById("box2")
        box1.onclick = function(event) {
			console.log(event.target)
            console.log(this)
        } 
        box2.onclick = function(event) {
            // 停止box2点击事件的传导
            event.stopPropagation()
			alert('我是box2')
        } 
    </script>
  </body>
</html>

冒泡为什么有利

当我们需要所有元素都有一个共有的事件时,我们如果没有冒泡就需要一个个给他们添加事件
如果我们有冒泡,就只需要给它们的共同祖先元素添加一个事件就可以,这就是冒泡的好处
因为我们自己元素点击之后,事件会向上冒泡,所以父级元素的处理器也会感知到


事件的委托

我们希望,只绑定一次事件,就可以让所有的超链接和未来新添加的都具有这些事件

思路:我们可以将事件统一绑定document,这样点击超链接之后,由于事件的冒泡会导致document的事件被触发,这样就只绑定了一次,所有的超链接都会具有这些事件
但是这也带来了一个问题,会让除了超链接外的元素也触发事件

委托:就是本该绑定给多个对象的事件,绑定给它们的共同祖先元素,这样就可以降低我们代码的复杂度

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>DOM</title>
  </head>
  <body>
      <button type="button" id="btn">
          点我一下
      </button>
      <ul id="list">
          <li><a href="javascript:;">链接1</a></li>
          <li><a href="javascript:;">链接2</a></li>
          <li><a href="javascript:;">链接3</a></li>
          <li><a href="javascript:;">链接4</a></li>
      </ul>
    <script>
        const links = document.links;
        const list = document.getElementById('list')
        const btn = document.getElementById('btn')
        for(let i = 0; i < links.length; i++) {
            links[i].addEventListener('click',(event)=>{
                alert(event.target.textContent)
            })
        }
        // 点击按钮之后新添加一个li
        /*
        	我们新添加的链接并不会绑定事件
        */
        btn.addEventListener('click',()=>{
            list.insertAdjancentHTML("beforeend","<li><a href="javascript:;">新链接</a><</li>")
        })
    </script>
  </body>
</html>

处理委托带来的问题

我们之前也说了问题的带来的问题,我们在给共有父元素绑定事件的时候,只要是子元素都有可能触发事件,那么我们如果要选择对应的子元素触发事件呢?

可以用以下的方式来解决

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>DOM</title>
  </head>
  <body>
      <button type="button" id="btn">
          点我一下
      </button>
      <ul id="list">
          <li><a href="javascript:;">链接1</a></li>
          <li><a href="javascript:;">链接2</a></li>
          <li><a href="javascript:;">链接3</a></li>
          <li><a href="javascript:;">链接4</a></li>
      </ul>
    <script>
      
        const list = document.getElementById('list')
        const links = list.getElementByTagName('li');
        const btn = document.getElementById('btn')
       
        document.addEventListener("click",(event)=>{
            if([...links].includes(event.target)){
				alert('超链接事件对象触发了')
            } 
        })
        // 点击按钮之后新添加一个li
        /*
        	我们新添加的链接并不会绑定事件
        */
        btn.addEventListener('click',()=>{
            list.insertAdjancentHTML("beforeend","<li><a href="javascript:;">新链接</a><</li>")
        })
    </script>
  </body>
</html>

这上面的代码必须是li才能触发事件,要不然是不能触发事件的


事件的捕获

在DOM中,事件的传播分为三个阶段

  1. 捕获阶段
    • 事件的捕获指的是我们的事件从外向内传导
    • 由祖先元素向目标元素进行事件的捕获
  2. 目标阶段(触发事件的对象)
  3. 冒泡阶段
    • 由目标元素想祖先元素进行冒泡从内向外传导

如果我们希望在捕获阶段触发事件,那么我们就需要将addEventListener()的第三个参数设置为true

注意:我们一般不希望在捕获阶段触发事件,设置了捕获事件,冒泡就会失效文章来源地址https://www.toymoban.com/news/detail-746069.html

  1. evnet.eventPhase:事件触发的时机
    1. 0:表示没有触发事件
    2. 1:是捕获阶段
    3. 2:表示为目标阶段
    4. 3:表示冒泡阶段

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>DOM</title>
      <style>
         #box1 {
			width:300px;
            height:300px;
            background-color:skyblue;
          }
         #box2 {
			width:200px;
            height:200px;
            background-color:orange;
          }
          #box2 {
			width:100px;
            height:100px;
            background-color:tomato;
          }
      </style>
  </head>
  <body>
      <div id="box1">
          <div id="box2">
          	 <div id="box3">   
      	  	 </div> 
      	  </div>    
      </div>
      <script>
          const box1 = document.getElemenetById("box1")
          const box2 = document.getElemenetById("box2")
          const box3 = document.getElemenetById("box3")
          
          box1.addEventListener("click",(event)=>{
              alert(1)
          },true)
          box2.addEventListener("click",(event)=>{
              alert(2)
          },true)
          box3.addEventListener("click",(event)=>{
              alert(3)
          },true)
      </script>
  </body>
</html>


到了这里,关于JavaScript复习——04 事件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在?聊聊浏览器事件循环机制

    目录 前言  同步/异步编程模型 同步 异步 JS异步模型 调用栈 任务队列 宏任务队列 微任务队列 微任务API 事件循环 队列优先级 混合队列 事件循环实现 总结 参考文章 Event-Loop可视化工具 JS是单线程语言,在某个时间段只能执行一段代码。这种单线程模型的好处是不会出现多

    2024年02月10日
    浏览(65)
  • 浏览器事件循环Event Loop

    引言: 事件循环不是浏览器独有的,从字面上看,“循环”可以简单地认为就是重复,比如for循环,就是重复地执行for循环体中的语句,所以事件循环,可以理解为重复地处理事件,那么下一个问题是,处理的是什么事件,事件的相关信息从哪里获取。 因为我没有用nodejs做

    2024年02月05日
    浏览(56)
  • Selenium:浏览器及鼠标、键盘事件

    目录 一、控制浏览器 二、鼠标事件 三、键盘事件 一、控制浏览器 webdriver主要提供操作页面上各种元素的方法,但它也提供操作浏览器的一些方法,例如控制浏览器大小、前进和后退等。 1、控制浏览器窗口大小 2、全屏显示 webdriver提供了maximize_window()方法使打开的浏览器全

    2024年02月02日
    浏览(41)
  • 【JavaScript】2.4 JavaScript和浏览器

    JavaScript最初是为了在浏览器中使用而创建的,它是Web开发的重要组成部分。在这一章节中,我们将学习如何使用JavaScript与浏览器进行交互。 DOM(Document Object Model)是一个编程接口,它允许JavaScript操作HTML文档的内容和结构。HTML文档被解析成一个DOM树,我们可以通过JavaScrip

    2024年02月04日
    浏览(46)
  • JavaScript复习——04 事件

    事件对象是由浏览器在外面触发事件的时候创建的,这个对象封装了各种事件相关的各种信息 例如: 鼠标的位置 键盘的按键 浏览器创建事件对象后,会将事件对象作为响应参数传递 在DOM类型中有多种不同类型的事件对象,但是他们都一个祖先Event event.clientX:获取鼠标的

    2024年02月05日
    浏览(36)
  • vue 监听浏览器网页关闭和网页刷新事件

    1、监听浏览器页面关闭/刷新事件。 运用场景:浏览器页面关闭后删除local storage、session、cookie、发送请求等。 2、只监听浏览器关闭事件

    2024年02月13日
    浏览(53)
  • [JavaScript] 第三章 Chrome 浏览器中调试JavaScript

    [JavaScript] 第一章 暂无 [JavaScript] 第一章 暂无 [JavaScript] 第三章 Chrome 浏览器中执行 JavaScript

    2024年02月15日
    浏览(51)
  • [JavaScript] 第三章 Chrome 浏览器中执行 JavaScript

    [JavaScript] 第一章 暂无 [JavaScript] 第一章 暂无 [JavaScript] 第三章 Chrome 浏览器中执行 JavaScript

    2024年02月16日
    浏览(58)
  • JavaScript中的浏览器环境和规格

    🧑‍🎓 个人主页: 《爱蹦跶的大A阿》 🔥 当前正在更新专栏: 《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​  ​         在我们的日常生活中,JavaScript已经成为了一种无处不在的编程语言。它的应用范围从简单的网页动画,到复杂的前端框架,

    2024年01月23日
    浏览(48)
  • 渡一大师课笔记(重点:事件循环、浏览器渲染原理)

    响应式原理(渡一) 什么是数据响应式? 函数与数据的关联(重要) 数据变化后,会自动重新运行依赖该数据的函数(重要) 被监控的函数 render、computed回调、watch、watchEffect 函数运行期间用到了响应式数据(响应式数据一定是个对象) 响应式数据变化会导致函数重新运行

    2024年02月15日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包