第一章-JavaScript基础进阶part2:事件

news2024/11/17 23:55:16

文章目录

  • 概念
  • 一、注册事件(绑定事件)
    • 1.1 addEventListener事件监听
  • 二、删除事件(解绑)
  • 三、DOM事件流
  • 四、事件对象event
    • 4.1 e.target与this与e.currentTarget的区别
    • 4.2 事件对象的常见属性
  • 五、阻止事件默认行为及冒泡
  • 六、事件委托(代理、委派)
  • 七、常用的鼠标事件
    • 7.1 常用的鼠标事件
    • 7.2 常用的鼠标事件对象
    • 7.3 鼠标事件对象案例-跟随鼠标
  • 八、常用的键盘事件
    • 8.1 常用键盘事件
    • 8.2 键盘事件对象-KeyboadEvent
    • 8.3 案例
      • 1、模拟京东按下S键聚焦输入框

概念

本节主要目标:

  • 了解注册事件的两种方式
  • 删除事件的两种方式
  • DOM事件流的三个阶段
  • 利用事件对象完成跟随鼠标案例
  • 能够封闭阻止冒泡兼容性函数
  • 事件委托的原理
  • 了解鼠标和键盘事件

一、注册事件(绑定事件)

什么是注册事件?
给元素添加事件,称为注册事件或者绑定事件。注册事件有两种方式:传统方式和方法监听注册方式
传统注册方式:

  • 利用on开头的事件
  • 特点:注册事件的唯一性,同一个元素同一个事件只能设置一个处理函数,最后注册的处理函数将会覆盖前面注册的处理函数
    方法监听注册方式
  • addEventListener() : 标准推荐方式,IE9以上可以
  • 特点:同一元素同一事件可注册多个,依次执行

1.1 addEventListener事件监听

eventTarget.addEventListener(type,listener[,userCapture])
  • eventTarget.addEventListener()方法将指定的监听器注册到eventTarget(目标对象上),当该对象触发指定的事件时,就会执行事件处理函数。
  • 该方法接收三个参数:
    • type: 事件类型字符串,如click, mouseover,注意不带on
    • listener: 事件处理函数,事件发生时,会调用该监听函数
    • useCapture: 可选参数,是一个布尔值,默认是false
<body>
  <button>监听注册事件</button>
  <script>
    var btn = document.querySelector("button")
    btn.addEventListener('click',function(){
      alert("点击触发")
    })
    btn.addEventListener("click",function(){
      alert("第2个监听器触发")
    })
  </script>
</body>

二、删除事件(解绑)

  • eventTarget.removeEventListener(event, listener[,useCapture])
<body>
  <div class="btn1">传统移除</div>
  <div class="btn2">监听移除</div>
  <script>
    var btn1 = document.querySelector(".btn1")
    var btn2 = document.querySelector(".btn2")
    // 传统移除
    btn1.onclick=function(){
      alert("弹完就移除点击")
      btn1.onclick=null
    }
    // 监听移除
    function fn(){
      alert("弹完就移除,且处理函数需要具名")
      btn2.removeEventListener("click",fn)
    }
    btn2.addEventListener("click",fn)

  </script>
</body>

三、DOM事件流

  • 事件流描述的是从页面中接收事件的顺序
  • 事件发生时会在元察节点之间按照特定的顺序传播,这个传捅过程即DOM 事件流
  • DOM事件流分为3个阶段
    1、捕获阶段
    2、当前目标阶段
    3、冒泡阶段
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 注意:
    • Js代码中只能执行捕获或者泡其中的一个阶段
    • onclick 和 attachEvent 只能得到冒泡阶段
    • addEventListener(type,listener[,useCapture])第三个参数如果是true,表示在事件捕获阶段调用事件处理程序;如果是 false(不写默认就是alse),表示在事件冒泡阶段调用事件处理程序。
    • 实际开发中我们很少使用事件捕获,我们更关注事件冒泡
    • 有些事件是没有旨泡的,比如 onblur、onfocus、onmouseerer、onmouseleave
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .parent {
        width: 400px;
        height: 400px;
        background: pink;
      }
      .child {
        width: 200px;
        height: 200px;
        background: purple;
        margin: 0 auto;
      }
    </style>
  </head>
  <body>
    <div class="parent">
      parent
      <div class="child">child</div>
    </div>
    <script>
      let parent = document.querySelector(".parent");
      let child = document.querySelector(".child");
      // 1、事件捕获:addEventListener第3个参数传true, 事件触发顺序从document->parent->child
      parent.addEventListener("click",function(){
        alert("这是parent")
      },true)
      child.addEventListener("click",function(){
        alert("这是child")
      },true)
      // 2、事件冒泡:addEventListener第3个参数传false或不传,事件触发顺序从child->parent-document
      // parent.addEventListener("click",function () {
      //     alert("这是parent");
      //   },
      //   false
      // );
      // child.addEventListener("click",
      //   function () {
      //     alert("这是child");
      //   },
      //   false
      // );
      // 3、onclick方式绑定事件,默认为冒泡
      // parent.onclick = function () {
      //   alert("这是parent");
      // };
      // child.onclick = function () {
      //   alert("这是child");
      // };
    </script>
  </body>
</html>

四、事件对象event

  • 事件处理函数的第一个默认参数及事件对象event,
  • 事件对象只有有了事件才会存在,它是系统自动创建的
  • 事件对象是事件的一系列相关数据的集合,跟事件相关的如鼠标点击事件里包含了鼠标相关信息,如坐标等。

4.1 e.target与this与e.currentTarget的区别

  • e.target: 指向触发事件的元素对象
  • e.currentTarget: 指向绑定事件的元素对象
  • this: 指向绑定事件的元素对象
<body>
  <div class="parent">例子
    <div class="child">child</div>
  </div>
  <script>
    var div = document.querySelector(".parent")
    div.addEventListener("click",function(e){
      // target返回触发事件的元素对象
      console.log(e.target)
      // this返回的是绑定事件的元素对象
      console.log(this)
      // e.currentTarget返回绑定事件的元素对象
      console.log(e.currentTarget)
    })
  </script>
</body>

4.2 事件对象的常见属性

  • e.type: 返回事件对象的类型,如click,mouseover
  • e.preventDefault: 阻止默认事件
  • e.stopPropagation() : 阻止冒泡
    在这里插入图片描述

五、阻止事件默认行为及冒泡

  • e.preventDefault: 阻止事件默认行为
  • e.stopPropagation: 阻止冒泡
<body>
    <div class="parent">
        <div class="child">阻止冒泡示例</div>
    </div>
    <script>
        // 例1:阻止冒泡
        var parent = document.querySelector(".parent")
        var child = document.querySelector(".child")
        parent.addEventListener("click",function(e){
            alert("parent click!")
        })
        child.addEventListener("click",function(e){
            alert("child click!")
            // 阻止冒泡,使parent click事件不被触发
            e.stopPropagation()
        })
    </script>
</body>
  • 阻止默认行为
 <a href="https://www.baidu.com">跳转链接</a>
    <script>
        // 阻止默认行为
        var alink = document.querySelector("a")
        alink.onclick=function(e){
            // 阻止点击链接后的跳转行为
            e.preventDefault()
        }
    </script>

六、事件委托(代理、委派)

事件委托:也叫事件代理

  • 原理:不是每个子节点单独设置事件监听器,而是事件监听器设置在其父节点上,然后利用冒泡原理影响设置每个子节点。
  • 作用:只操作了一次DOM,提高了程序的性能

<body>
    <ul>
        <li>事件委托原理1</li>
        <li>事件委托原理2</li>
        <li>事件委托原理3</li>
        <li>事件委托原理4</li>
        <li>事件委托原理5</li>
    </ul>
    <script>
        // 笨办法
        var ul = document.querySelector("ul")
        var lis = document.querySelectorAll("li")
        for(let i=0;i<lis.length;i++){
            lis[i].onclick=function(){
                this.style.color='red'
            }
        }
        // 事件委托
        ul.onclick=function(e){
            let li = e.target // 利用事件冒泡原理,拿到的target为触发事件的元素对象li
            e.target.style.color='red'
        }
    </script>
</body>

七、常用的鼠标事件

7.1 常用的鼠标事件

  • 选中文字事件:selectstart
  • 右键菜单事件:contextmenu
  • 点击事件:onclick
  • 鼠标经过触发:onmouseover
  • 鼠标离开事件:onmouseout
  • 获得鼠标焦点触发:onfocus
  • 失去鼠标焦点般发:onblur
  • 鼠标移动触发:onmousemove
  • 鼠标弹起触发:onmouseup
  • 鼠标按下触发:onmousedown
<body>
    <div>这是一段阻止右键以及不能选中的文字</div>
    <script>
        var div = document.querySelector("div")
        div.oncontextmenu=function(e){
            // 阻止弹出右键菜单
            e.preventDefault()
        }
        div.onselectstart = function(e){
            // 阻止文字选中
            e.preventDefault()
        }
    </script>
</body>

7.2 常用的鼠标事件对象

  • event对象代表事件的状态,跟事件相关的一系列信息的集合。现阶段我们主要是用鼠标事件对象MouseEvent 和健盘事件对象 KeyboardEvent
  • 常见的鼠标事件对象:
    • e.clientX: 返回鼠标相对于浏览居南口可视区的 X 坐标
    • e.clientY:返回鼠标相对于浏览器窗口可视区的 Y 坐标
    • e.pageX:返回鼠标相对于文档页面的X 坐标 E9+ 支持
    • e.pageY:返回鼠标相对于文档页面的 Y 坐 E9+ 支持
    • e.screenX: 返回鼠标相对于电脑屏幕的X坐标
    • e.screenY: 返回鼠标相对于电鹏屏幕的Y 坐标
<!DOCTYPE html>
<html lang="en">
<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>
    <style>
        body{
            height: 3000px;
        }
    </style>
</head>
<body>
    <script>
        // 当页面向下滚动一定距离后点击,发现三组值的不同
      document.addEventListener("click",function(e){
        // client组:返回当前可视区的坐标
        let clientX = e.clientX
        let clientY = e.clientY
        console.log(clientX,clientY)
        // page组:返回当前文档页面的坐标
        let pageX = e.pageX
        let pageY = e.pageY
        console.log(pageX,pageY)
        // screen组:返回当前点击电脑屏幕的坐标
        let screenX = e.screenX
        let screenY = e.screenY
        console.log(screenX,screenY)
      })
    </script>
</body>
</html>

7.3 鼠标事件对象案例-跟随鼠标

<!DOCTYPE html>
<html lang="en">
<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>
    <style>
        .follow{
            position: absolute;
           user-select: none;
        }
    </style>
</head>
<body>
    <div class="follow">显眼包</div>
    <script>
        let follow = document.querySelector(".follow")
        document.addEventListener("mousemove",function(e){
            let pageX = e.pageX
            let pageY = e.pageY
            follow.style.left = pageX+'px'
            follow.style.top = pageY+'px'
        })
    </script>
</body>
</html>
  • 拓展:电商网站鼠标移入商品图看大图功能实现基于此原理

八、常用的键盘事件

8.1 常用键盘事件

  • onkeyup: 键盘松开时
  • onkeydown: 键盘按钮时, 返回键盘代码(键盘上真实键的数字)
  • onkeypress: 键盘被按下时,返回键字符代码(ASCII 字符),且不识别功能键如ctrl,shift等
  • 执行顺序:down -> press->up
  • keydown,keypress按下时会一直触发
  <script>
        document.addEventListener("keyup",function(){
            console.log("keyup")
        })
        document.addEventListener("keypress",function(){
            console.log("keypress")
        })
        document.addEventListener("keydown",function(){
            console.log("keydown")
        })
    </script>

8.2 键盘事件对象-KeyboadEvent

  • e.keyCode: 返回键盘对应的码值(注意keydown与keypress不同,推荐使用keydown)
  • e.key: 返回键盘对应的值
 <script>
        //    阻止页面Ctrl+S的默认保存行为
        document.addEventListener("keydown", function (e) {
        console.log(e.key,e.keyCode,e)
            let keyCode = e.keyCode
            // 83为s键码
            if(keyCode==83&&e.ctrlKey){
                e.preventDefault();
                console.log("按下了ctrl s")
            }
        })
    </script>

8.3 案例

1、模拟京东按下S键聚焦输入框

  • 思路:keyup事件,keyCode为83时,让输入框聚焦focus
<body>
    <input type="text">
    <button >搜索</button>
    <script>
        let search = document.querySelector("input")
        document.addEventListener("keyup",function(e){
            if(e.keyCode==83){
                search.focus()
            }
        })
    </script>
</body>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/837208.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【CSS】旋转中的视差效果

效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"/><meta http-equiv"X-UA-Compatible" content"IEedge"/><meta name"viewport" content"widthdevice-…

【SpringBoot】日志是+基于lombok的日志输出

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE进阶 在我们日常的程序开发中&#xff0c;日志是程序的重要组成部分&#xff0c;想象⼀下&#xff0c;如果程序报错了&#xff0c;不让你打开控制台看⽇志&#xff0c;那么你能找到报错的原因吗…

网络安全设备-等保一体机

本文为作者学习文章&#xff0c;按作者习惯写成&#xff0c;如有错误或需要追加内容请留言&#xff08;不喜勿喷&#xff09; 本文为追加文章&#xff0c;后期慢慢追加 等保一体机的功能 等保一体机产品主要依赖于其丰富的安全网元&#xff08;安全网元包括&#xff1a;防火…

problem(3):python IDE和python解释器

为什么写这篇文章呢&#xff1f;遇到了下面的问题&#xff0c;相同的解释器&#xff0c;如果运行angr库的代码&#xff0c;会出现 这样的情况&#xff0c;但是用spyder IDE 会显示正常&#xff0c;很奇怪 应该就是IDE的原因 IDE的循环导入问题 检查IDE配置&#xff1a; 如果可…

DoIP学习笔记系列:(四)用CAPL脚本读取DID的关键点

文章目录 1. 如何在CAPL中读取DID?1.1 避坑如何新建CAPL工程,在此不再赘述,本章主要分享一下如何在CAPL中调用DoIP接口、diag接口进行DoIP和诊断的测试。 1. 如何在CAPL中读取DID? 通常在实际项目中,会有很多DID,各种版本号、各种观测量,如果手动点,显然很麻烦,如果要…

pyspark使用XGboost训练模型实例

遇到一个还不错的使用Xgboost训练模型的githubhttps://github.com/MachineLP/Spark-/tree/master/pyspark-xgboost 1、这是一个跑通的代码实例&#xff0c;使用的是泰坦尼克生还数据&#xff0c;分类模型。 这里使用了Pipeline来封装特征处理和模型训练步骤&#xff0c;保存为…

多语言gRPC开发入门与避坑指南

目录 gRPC相关介绍 什么是gPRC gPRC的优点 gPRC的缺点 gPRC定位 协议缓冲区&#xff08;Protocol Buffers&#xff09; 四种调用方式 gRPC开发三大步骤 第一步&#xff1a;定义和编写proto服务文件 第二步&#xff1a;proto文件转化为gRPC代码 第三步&#xff1a;调…

vue3—SCSS的安装、配置与使用

SCSS 安装 使用npm安装scss&#xff1a; npm install sass sass-loader --save-dev 配置 配置到全局 &#x1f31f;附赠代码&#x1f31f; css: {preprocessorOptions: {scss: {additionalData:import "./src/Function/Easy_I_Function/Echarts/ToSeeEcharts/utill.…

caj文件怎么转换成pdf?了解一下这种方法

caj文件怎么转换成pdf&#xff1f;如果你曾经遇到过需要将CAJ文件转换成PDF格式的情况&#xff0c;那么你一定知道这是一件麻烦的事情。幸运的是&#xff0c;现在有许多软件和工具可以帮助你完成这项任务。下面就给大家介绍一款使用工具。 【迅捷PDF转换器】是一款功能强大的工…

camunda-modeler(5.9.0)介绍及下载

官网地址: https://camunda.com/ 中文站点:http://camunda-cn.shaochenfeng.com Camunda Modeler是一个用于创建、编辑和验证BPMN、CMMN和DMN模型的工具。它提供了一个可视化的界面&#xff0c;使用户可以以图形方式设计和调整工作流程、决策表和案例管理模型。 具体来说&…

8266 ESP-07模块的使用 以及详细介绍

esp8266系列 陶瓷天线 版本 详细介绍说明 最近使用8266的ESP-01S做了个数据无线收发装置&#xff0c;发现板载天线信号太弱&#xff0c;装上外壳后信号更弱&#xff0c;因此考虑能否使用带有外接天线的模块代替ESP-01S。经过在安可信官网搜索发现&#xff0c;ESP07、ESP07S、ES…

2023上半年手机及数码行业分析报告(京东销售数据分析)

2023年上半年&#xff0c;手机市场迎来复苏&#xff0c;同环比来看&#xff0c;销量销额纷纷上涨。 而数码市场中&#xff0c;各个热门品类表现不一。微单相机及智能手表同比去年呈现增长态势&#xff0c;而笔记本电脑市场则出现下滑。 基于此现状&#xff0c;鲸参谋发布了20…

Python实现(条形码,二维码)生成识别

Python实现&#xff08;二维码&#xff0c;条形码&#xff09;生成识别 生成条形码生成二维码识别条形码二维码 生成条形码 安装barcode模块: $ pip install python-barcode barcode文档 import barcode from barcode.writer import ImageWriter # 更多了解&#xff1a;https…

TX验证码

好久没分享文章了&#xff0c;今天来水水文章。 水的意思就是&#xff1a;文章不会分析参数的生成流程。 最开始菜鸡弟弟以为腾讯防水墙就只有一个滑块来着&#xff0c;也感谢不不哥哥提供的网址。 来看下tx旗下的验证类型。 当然除了这些之外&#xff0c;还有一种六宫格的&a…

心率变异性HRV指标说明:SDNN,SDANN,RMSSD,SDNNIndex,SDSD,NN50,PNN50;TP,ULF,VLF,LF,HF

自主神经活动与多种疾病有关系&#xff0c;特别是与某些心血管疾病的死亡率&#xff0c;尤其与猝死率有关。同时&#xff0c;也公认心率变异性&#xff08;HRV&#xff09;分析是判断自主神经活动的常用的定量指标。HRV降低是预测心脏病人死亡的独立危险因子&#xff0c;有十分…

java gc分析

使用工具转换&#xff1a;https://ctbots.com/#/ 通用GC分析 jstat -gc -t pid堆内存分析 jstat -gccapacity -t pid年轻代GC分析 jstat -gcnew -t pid年轻代内存分析 jstat -gcnewcapacity -t pid老年代GC分析 jstat -gcold -t pid老年代内存分析 jstat -gcoldcapacity…

IO进程线程第七天(8.4)信号量,条件变量

在第一题的基础上加上一个需求&#xff1a;要求打印&#xff0c;倒置线程&#xff0c;顺序执行。出现的现象为先打印1234567&#xff0c;后打印7654321&#xff08;不使用flag&#xff09; 创建两个线程&#xff0c;其中一个线程读取文件中的数据&#xff0c;另外一个线程将读…

新手Vite打包工具的使用并解决yarn create vite报错

一、手动创建 1.创建vite-Demo文件夹 2.初始化 yarn init -y 3.安装vite yarn add -D vite 4.打包准备 说明&#xff1a;不需要在src下面创建&#xff0c;在vite-Demo文件夹创建 4.1index.js文件 document.body.insertAdjacentHTML("beforeend","<h1>…

MySQL函数(二十五)

二八佳人体似酥&#xff0c;腰悬利剑斩愚夫&#xff0c;虽然不见人头落,暗里教君骨髓枯。 上一章简单介绍了 MySQL存储过程(二十四),如果没有看过,请观看上一章 前面学习了很多函数&#xff0c;使用这些函数可以对数据进行的各种处理操作&#xff0c;极大地提高用户对数据库的…

Linux(三):Linux服务器下日常实操命令 (常年更新)

基础命令 cd命令&#xff1a;切换目录 cd &#xff1a;切换当前目录百至其它目录&#xff0c;比如进入/etc目录&#xff0c;则执行 cd /etccd / &#xff1a;在Linux 系统中斜杠“/”表示的是根目录。cd / ,即进入根目录.cd ~&#xff1a;进入用户在该系统的home目录&#…