JavaScript【十】JavaScript事件

news2025/1/10 1:44:55

文章目录

  • 🌟前言
  • 🌟事件
  • 🌟绑定事件的方式:
    • 🌟标签绑定事件:
    • 🌟Document对象来绑定事件:on+事件type
    • 🌟 事件监听:使同一个对象的同一事件绑定多个事件处理程序。兼容IE9及以上。
      • 🌟 绑定事件
      • 🌟 移除事件绑定
      • 🌟 事件监听的兼容写法
  • 🌟事件对象
    • 🌟 应用场景:
    • 🌟获取事件对象
    • 🌟 事件对象常用的方法和属性
      • 🌟 鼠标事件相关
      • 🌟 滚轮事件相关:
      • 🌟 键盘事件相关对象:
      • 🌟 其他属性和方法
  • 🌟事件流
    • 🌟 两种事件流模型
      • 🌟 DOM事件流
        • 🌟 DOM事件流的三个阶段
      • 🌟 事件委派
        • 🌟 用法
        • 🌟 应用场合
  • 🌟 自定义事件(观察者模式)
    • 🌟 事件创建
    • 🌟 自定义事件的监听
    • 🌟 自定义事件的触发
    • 🌟 简单的例子
  • 🌟 DOM事件流的简单例子
  • 🌟写在最后

在这里插入图片描述

🌟前言

哈喽小伙伴们,本文将收录在JavaScript【前端童子功】这个专栏里;这个专栏里边会收录一些JavaScript的基础知识和项目实战;希望大家可以多多支持,你们的支持就是我创作的动力;让我们一起来看看吧🤘

🌟事件

首先,什么是事件呢? 首先说JS就是为了实现一些动态的操作,而用户会有时候想去实现一些功能,如提交表单,鼠标点击等,就要在浏览器中触发这个事件,然后浏览器会感知(或者说捕获)到用户的这个行为,就会去响应处理这个事件。 这个就称之为 事件。

🌟绑定事件的方式:

🌟标签绑定事件:

<button onclick="click_fn()">click</button>
<script>
  function click_fn(){
    console.log(this);
  }
</script>

🌟Document对象来绑定事件:on+事件type

注意:重复监听某一事件,后者会覆盖前者,而不会两者先后触发

<button>click</button>
<script>
    var button1 = document.querySelector('button')
    button1.onclick=function(){
        console.log("第一个点击事件的方法");
    }
    var button2 = document.querySelector('button')
    button2.onclick=function(){
        console.log("第二个点击事件的方法");
    }      //第二个点击事件的方法会覆盖第一个方法,所以点击只会触发第二次的点击事件方法     
</script>

🌟 事件监听:使同一个对象的同一事件绑定多个事件处理程序。兼容IE9及以上。

为一个事件添加多个事件处理程序,解决了上面两种方法不能添加多个方法 更精细的控制事件监听器的触发阶段

🌟 绑定事件

语法:

element.addEventListener(事件名称(不写前缀),函数,布尔值(可不写));
参数类型描述
eventstring表示事件类型的字符串 如:“click” “mouseover” 事件名称不添加on前缀
callbackfunction表示事件处理程序,函数中的this 指向添加监听的对象
boolboolean可选,true表示在捕获阶段调用事件处理程序;false表示在冒泡阶段调用。后面会有事件流的详细解释
标签.addEventListener("事件名称",function(){},false);    //兼容到IE9及其以上

标签.attachEvent("事件名称",function(){})    //  ie8及以下

🌟 移除事件绑定

语法:

element.removeEventListener(event,callback,bool);
<button id="myBtn"></button>
<script type="text/javascript">
  var btn=document.getElementById('myBtn');
  function handle(){
    console.log(this);
  }
  
  //兼容到IE9及其以上
  btn.addEventListener('click',handle,false);      //添加事件处理程序
  btn.removeEventListener('click',handle,false);    //移除事件处理程序

  //  ie8及以下
  btn.attachEvent('onclick',handle);       // 添加
  btn.detachEvent('onclick',handle);       // 移除
</script>

注意:当需要移除事件监听,不能使用匿名函数。必须能够获取函数引用。

🌟 事件监听的兼容写法

/function addEvent(obj,type,handle){
  try{
   obj.addEventListener(type,handle,false);
  }catch(e){
   try{
    obj.attachEvent('on'+type,handle);
   }
   catch(e){
    obj['on' + type]=handle;     //早期浏览器
   }
  }
}

🌟事件对象

在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的信息。所有浏览器都支持event对象,但支持方式不同。

🌟 应用场景:

  • 需要知道你按下的键盘码时。
  • 需要知道鼠标点击的坐标时。
  • 阻阻止止冒泡流事件的发生。

🌟获取事件对象

event对象是事件程序的第一个参数(IE8及以下不支持)

<div id="box" style="height:30px;width:200px;background:pink;"></div>
<script>
var oBox = document.getElementById('box');
oBox.onclick = function(event){
    box.innerHTML = event;
}
</script>

直接使用event变量(火狐浏览器不支持,输出event未定义)

<div id="box" style="height:30px;width:200px;background:pink;"></div>
<script>
var oBox = document.getElementById('box');
oBox.onclick = function(){
    box.innerHTML = event;
}
</script>

兼容性写法

<div id="box" style="height:30px;width:200px;background:pink;"></div>
<script>
var oBox = document.getElementById('box');
oBox.onclick = function(e){
  e = e || event;
  box.innerHTML = e;
}
    
oBox.addEventListener("click",function(e){},false)
</script>

🌟 事件对象常用的方法和属性

🌟 鼠标事件相关

属性含义
clientX当鼠标事件发生的时候,鼠标相对于浏览器X轴的位置
clientY当鼠标事件发生的时候,鼠标相对于浏览器Y轴的位置
offsetX当鼠标事件发生的时候,鼠标相对于事件源X轴的位置
offsetY当鼠标事件发生的时候,鼠标相对于事件源Y轴的位置
pageX当鼠标事件发生的时候,鼠标相对于浏览器X轴的位置,包含页面横向滚动距离
pageY当鼠标事件发生的时候,鼠标相对于浏览器X轴的位置,包含页面纵向滚动距离

🌟 滚轮事件相关:

属性含义
wheelDelta获取滚轮的上下滚动。正值向上,负值向下。
e.wheelDelta
上: 120  240
下:-120 -240

🌟 键盘事件相关对象:

属性含义
key获取当前所按键的名称
keyCode获取当前所按键的键盘码
ctrlKey判断当前ctrl键是否按下的状态
shiftKey判断当前shift键是否按下的状态
altKey判断当前alt键是否按下的状态
target获取当前元素的DOM对象

🌟 其他属性和方法

属性含义
preventDefault()阻止浏览器默认行为
stopPropagation()阻止事件流的传播 [e.stopProagation();]
currentTarget指向被绑定事件的元素
target指向事件触发的对象,当事件是处在冒泡或者捕获阶段调用的时候,指向最先触发事件的事件源
type返回当前所触发事件的事件名称

🌟事件流

事件发生时会在元素节点与根节点之间按照特定的顺序传播,路径所经过的所有节点都会收到该事件,这个传播过程即DOM事件流。 事件传播的顺序对应浏览器的两种事件流模型:捕获型事件流和冒泡型事件流。

🌟 两种事件流模型

  • 冒泡型事件流:事件的传播是从最特定的事件目标到最不特定的事件目标。

on+type; 事件监听:false。

  • 捕获型事件流:事件的传播是从最不特定的事件目标到最特定的事件目标。

事件监听:ture。

在这里插入图片描述

IE9、Firefox、Chrome、Opera、和Safari都支持事件捕获。尽管DOM标准要求事件应该从document对象开始传播,但这些浏览器都是从window对象开始捕获事件的。

🌟 DOM事件流

DOM标准采用捕获+冒泡。两种事件流都会触发DOM的所有对象,从document对象开始,也在document对象结束。

🌟 DOM事件流的三个阶段

DOM标准规定事件流包括三个阶段:事件捕获阶段、处于目标阶段和事件冒泡阶段。
eventPhase属性返回一个整数值,表示事件目前所处的事件流阶段:0表示事件没有发生,1表示捕获阶段,2表示目标阶段,3表示冒泡阶段

  1. 事件捕获阶段:实际目标(<div>)在捕获阶段不会接收事件。也就是在捕获阶段,事件从document到<html>再到<body>就停止了。
  2. 处于目标阶段:事件在<div>上发生并处理。但是事件处理会被看成是冒泡阶段的一部分。
  3. 冒泡阶段:事件又传播回文档。
  4. 所有的事件都要经过捕获阶段和处于目标阶段,但是有些事件会跳过冒泡阶段:如,获得输入焦点的focus事件和失去输入焦点的blur事件。

🌟 事件委派

事件委派的原理用到的就是事件冒泡和目标元素,把事件处理器添加到父元素,等待子元素事件冒泡,并且父元素能够通过target(IE为srcElement)判断是哪个子元素,从而做相应处理。

🌟 用法

  1. 子元素的事件加到父元素上
  2. 触发事件时判断 触发该事件的元素是什么(e.target)
    • 判断内容 innerHTML innerText
    • 标签名 nodeName (判断的时候,标签名需要大写)
    • 属性 e.target.hasAttribute(“属性名”); 有则是true 无则是false
    • 类名 ID e.target.classList.contains(“类名”); 有则是true 无则是false
  3. 在判断成功中写对应的处理函数

🌟 应用场合

  1. 需要给大量元素添加同一事件处理程序的时候,提高代码运行的效率
  2. 在页面加载完成后新创建的元素, 比如通过ajax异步加载生成dom对象

🌟 自定义事件(观察者模式)

自定义事件,顾名思义,就是自己定义事件类型,自己定义事件处理函数.

🌟 事件创建

JS中,最简单的创建事件方法,是使用Event构造器:

var myEvent = new Event('event_name');

为了能够传递数据,使用 CustomEvent 构造器:

var myEvent = new CustomEvent('event_name', { detail:{
    // 将需要传递的数据写在detail中,以便在EventListener中获取
    // 数据将会在event.detail中得到
}, });

🌟 自定义事件的监听

JS的EventListener是根据事件的名称来进行监听的,我们进行自定义事件监听的时候,需要创建相应的监听器

//假设listener注册在window对象上
window.addEventListener('event_name', function(event){
  // 如果是CustomEvent,传入的数据在event.detail中
  console.log('得到数据为:', event.detail);
  // ...后续相关操作
});

进行到这一步,window对象上就有了event_name这个事件的监听器,当触发这个事件时,相应的回调函数就会触发

🌟 自定义事件的触发

普通的事件触发我们都有相对应的操作区,比如click,鼠标单击来触发,自定义事件需要我们显式的去触发它,使用dispatchEvent去触发(IE8低版本兼容,使用fireEvent);

if(window.dispatchEvent) {  
    window.dispatchEvent(myEvent);
} else {
    window.fireEvent(myEvent);
}

🌟 简单的例子

var myEvent = new CustomEvent('event_name', {
  detail: { title: 'This is title!'},
});
window.addEventListener('event_name', function(event){
  console.log('得到标题为:', event.detail.title);
});
// 随后在对应的元素上触发该事件
if(window.dispatchEvent) {
  window.dispatchEvent(myEvent);
} else {
   window.fireEvent(myEvent);
}

🌟 DOM事件流的简单例子

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<style>
    #outer{
        position: absolute;
        width: 400px;
        height: 400px;
        top:0;
        left: 0;
        bottom:0;
        right: 0;
        margin: auto;
        background-color: deeppink;
    }
    #middle{
        position: absolute;
        width: 300px;
        height:300px;
        top:50%;
        left: 50%;
        margin-left: -150px;
        margin-top: -150px;
        background-color: deepskyblue;
    }
    #inner{
        position: absolute;
        width: 100px;
        height:100px;
        top:50%;
        left:50%;
        margin-left: -50px;
        margin-top: -50px;;
        background-color: darkgreen;
        text-align: center;
        line-height: 100px;
        color:white;
    }
    #outer,#middle,#inner{
        border-radius:100%;
    }
</style>
<body>
<div id="outer">
    <div id="middle">
        <div id="inner">
            click me!
        </div>
    </div>
</div>
<script>
    var innerCircle= document.getElementById("inner");
    innerCircle.addEventListener("click", function () {
        alert("innerCircle的click事件在捕获阶段被触发");
    },true);
    innerCircle.addEventListener("click", function () {
        alert("innerCircle的click事件在冒泡阶段被触发");
    },false);
    var middleCircle= document.getElementById("middle");
    middleCircle.addEventListener("click", function () {
        alert("middleCircle的click事件在捕获阶段被触发");
    },true);
    middleCircle.addEventListener("click", function () {
        alert("middleCircle的click事件在冒泡阶段被触发");
    },false);
    var outerCircle= document.getElementById("outer");
    outerCircle.addEventListener("click", function () {
        alert("outerCircle的click事件在捕获阶段被触发");
    },true);
    outerCircle.addEventListener("click", function () {
        alert("outerCircle的click事件在冒泡阶段被触发");
    },false);
</script>
</body>
</html>

🌟写在最后

更多JavaScript知识以及API请大家持续关注,尽请期待。各位小伙伴让我们 let’s be prepared at all times!

✨原创不易,还希望各位大佬支持一下!
👍 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!

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

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

相关文章

Zephyr RTOS应用开发(nrf5340)

目录 概述 开发环境安装 创建一个新的Zephyr应用 构建应用并刷写到开发板 概述 Zephyr™项目是一个采用Apache 2.0协议许可&#xff0c;Linux基金会托管的协作项目。针对低功耗、小型内存微处理器设备开发的物联网嵌入式小型、可扩展的实时操作系统&#xff0c;支持多种硬件…

redis哨兵机制详解

文章目录前言监控&#xff08;Monitoring&#xff09;自动故障转移&#xff08;Automatic failover&#xff09;配置提供者&#xff08;Configuration provider&#xff09;通知&#xff08;Notification&#xff09;哨兵集群的组建哨兵监控Redis库主库下线的判定主观下线客观下…

ORB-SLAM2原理分析

原理分析 ORB-SLAM2是一种基于单目、双目和RGB-D相机的实时视觉SLAM系统&#xff0c;用于在无GPS信号或有限的传感器信息情况下&#xff0c;构建三维地图并定位相机的位置和姿态。ORB-SLAM2采用了ORB特征点提取和描述符匹配技术&#xff0c;以及图优化和闭环检测算法&#xff…

分布式系统监控zabbix安装部署及使用

目录 一、zabbix监控 1、什么是zabbix 2、zabbix功能 3、zabbix运行机制 4、zabbix的3种架构 ①C/S架构 ②zabbix-proxy-client架构 ③master-zabbix-client架构 5、zabbix工作原理及数据走向 6、zabbix监控模式 7、zabbix部署 8、zabbix图形化页面显示设置 二、Z…

技术复盘(3)--ElasticSearch

技术复盘--ElasticSearch技术复盘(3)--ElasticSearch资料地址概述对比solrwindows下使用esIK分词器介绍es基本命令集成springboot以及调用api技术复盘(3)–ElasticSearch ElasticSearch7.x 资料地址 ElasticSearch官网&#xff1a;https://www.elastic.co/ ElasticSearch-he…

unity3d:网络同步,状态同步,源码,C#服务器demo

协议数据单元 网络同步包最小单元PDU // 预测的基础数据类型 public class PDU { public uint UID; //玩家的唯一id public PDUType type; //PDU类型 public Vector3 position; // 位置 public Vector3 forward; // 朝向 public float speed; // 速度: 速度为…

【STL十一】无序容器(哈希容器)—— unordered_map、unordered_set

【STL十一】无序容器&#xff08;哈希容器&#xff09;—— unordered_map、unordered_set一、简介1、关联容器和无序容器不同2、无序容器特点二、头文件三、模板类四、无序容器的内部结构1、管理桶2、内部结构五、unordered_map成员函数1、迭代器2、元素访问3、容量4、修改操作…

CV大模型应用:Grounded-Segment-Anything实现目标分割、检测与风格迁移

Grounded-Segment-Anything实现目标分割、检测与风格迁移 文章目录Grounded-Segment-Anything实现目标分割、检测与风格迁移一、Segment-Anything介绍二、Grounded-Segment-Anything1、简介2、测试一、Segment-Anything介绍 代码链接&#xff1a;https://github.com/facebookr…

Direct3D 12——混合——雾

实现雾化效果的流程如下&#xff1a;如图所示&#xff0c;首先指明雾的颜色、由摄像机到雾气的最近距离以及雾 的分散范围(即从雾到摄像机的最近距离至雾能完全覆盖物体的这段范围)&#xff0c;接下来再将网格三角形上点 的颜色置为原色与雾色的加权平均值&#xff1a; foggedC…

Python爬虫之多线程加快爬取速度

之前我们学习了动态翻页我们实现了网页的动态的分页&#xff0c;此时我们可以爬取所有的公开信息了&#xff0c;经过几十个小时的不懈努力&#xff0c;一共获取了 16万 条数据&#xff0c;但是软件的效率实在是有点低了&#xff0c;看了下获取 10 万条数据的时间超过了 56 个小…

【技巧】Word“只读方式”的设置与取消

如果你担心在阅读Word文档的时候&#xff0c;不小心修改并保存了内容&#xff0c;那就给文档设置“只读方式”吧&#xff0c;这样就算不小心做了修改也不能随意保存。 Word文档的“只读方式”有两种模式&#xff0c;对此不清楚的小伙伴&#xff0c;来看看如何设置和取消吧。 模…

第一次作业

作业内容&#xff1a;1&#xff0c;atd和crond的区别 2&#xff0c;指定在2023/08/26 09&#xff1a;00将时间写入testmail.txt文件中 3&#xff0c;指定在每天凌晨4&#xff1a;00将该时间点之前的系统日志信息备份到个目录下&#xff08;/var/log/messages &#xff09;&…

华为手表开发:WATCH 3 Pro(17)传感器订阅指南针

华为手表开发&#xff1a;WATCH 3 Pro&#xff08;17&#xff09;传感器订阅指南针初环境与设备指南针传感器介绍与说明鸿蒙开发文件夹&#xff1a;文件新增展示的文本标记index.hmlindex.cssindex.js初 希望能写一些简单的教程和案例分享给需要的人 鸿蒙可穿戴开发 环境与设…

二 、Locust自定义用户(场景)

二 、自定义用户&#xff08;场景&#xff09; 一个用户类代表了你系统中的一种用户/场景。当你做一个测试运行时&#xff0c;你指定你想模拟的并发用户的数量&#xff0c;Locust将为每个用户创建一个实例。你可以给这些类/实例添加任何你喜欢的属性&#xff0c;但有一些属性对…

蹭ChatGPT热点有风险,昆仑万维蹭热点被发监管函

‍数据智能产业创新服务媒体——聚焦数智 改变商业要说2023年互联网行业最火爆的概念&#xff0c;ChatGPT绝对当仁不让。国外有微软&#xff0c;国内有百度、阿里、商汤、三六零等&#xff0c;各大互联网巨头都对这个概念青睐有加。众多企业纷纷宣布投身赛道&#xff0c;誓要做…

帮助企业应对不确定性,Serverless时代正在来临

近年来层出不穷的“黑天鹅”事件&#xff0c;让越来越多的企业和组织开始高度关注市场的不确定性。为了增强抵御风险的能力&#xff0c;企业纷纷从开拓业务创新、降低生产成本、提高运营效率、提升用户体验及满意度等方面着手&#xff0c;努力提高自身的核心竞争力。在这样的时…

Java集合——List接口学习总结

一、ArrayList实现类 1. 常用方法 增加&#xff1a;add(int index, E element)删除&#xff1a;remove(int index) remove(Object o)修改&#xff1a;set(int index, E element)查看&#xff1a;get(int index)判断&#xff1a;常用遍历方式&#xff1a;//List集合 遍历&…

2023MathorCup数模C题思路数据代码论文【全网最全分享】

文章目录赛题思路赛题详情参赛建议&#xff08;个人见解&#xff09;选择队友及任务分配问题&#xff08;重要程度&#xff1a;5星&#xff09;2023MathorCup数模C题思路数据论文代码【最新】赛题思路 (赛题出来以后第一时间在CSDN分享) 最新进度在文章最下方卡片&#xff0c;…

Atlassian后Server时代 | Server版vs.数据中心版,二者的区别在哪里?

2024年2月&#xff0c;也就是一年不到&#xff0c;Atlassian将终止对Server产品及插件的所有支持。 此公告发布后&#xff0c;许多用户需要了解怎样的前进方向才是最适合企业的。为此&#xff0c;Atlassian提供了本地部署的数据中心&#xff08;Data Center&#xff09;版以及云…

浅聊MVCC,希望能对你有帮助

浅聊MVCC&#xff0c;希望能对你有帮助&#x1f3cd; 前言 多版本并发控制是数据库管理系统中的一项重要技术&#xff0c;它可以提高数据库的并发性能和可靠性&#xff0c;支持高并发的读写操作&#xff0c;提高数据的安全性&#xff0c;具有重要的应用价值和意义。笔者写此文…