07-JavaScript DOM事件

1. 事件

1.1 事件概述

JavaScript 使我们有能力创建动态页面,而事件是可以被 JavaScript 侦测到的行为。

简单理解: 触发--- 响应机制

网页中的每个元素都可以产生某些可以触发 JavaScript 的事件,例如,我们可以在用户点击某按钮时产生一个事件,然后去执行某些操作。

1.2 事件三要素

  • 事件源(谁):触发事件的元素

  • 事件类型(什么事件): 例如 click 点击事件

  • 事件处理程序(做啥):事件触发后要执行的代码(函数形式),事件处理函数

1.3 事件对象event

在触发DOM元素上的某个事件时,会产生一个事件对象event,这个事件对象中包含着所有与事件有关的信息。包括导致事件的元素、事件的类型以及其他与事件有关的信息。

  • 什么时候会产生event 对象呢?

    • 例如: 当用户单击某个元素的时候,我们给这个元素注册的事件就会触发,该事件的本质就是一个函数,而该函数的形参接收一个event对象.

  • 事件通常与函数结合使用,函数不会在事件发生前被执行!

1.3.1 事件对象的使用

  var box = document.getElementById('box');box.onclick = function(e){console.log(e).........}

1.3.2 事件对象(event)的属性

属性和方法描述
type返回当前 event 对象表示的事件的名称。
preventDefault()通知浏览器不要执行与事件关联的默认动作(阻止默认行为)
target返回触发此事件的元素(事件的目标节点)。
currentTarget返回其事件监听器触发该事件的元素。
keyCode返回键盘事件中的键码值
stopPropagation()阻止事件传播。

1.3.3 this指向总结(重点)

  • 自定义构造函数中this:指向实例化对象

  • 普通函数中this:指向window

  • 自定义对象的方法中this:指向当前对象

  • 事件绑定的函数中的this:指向事件的绑定者

1.3.4 事件对象的兼容性写法

 box.onclick = function(e) {// 事件对象//兼容IE8以下的写法e = e || window.event;var target = e.target || e.srcElement;console.log(target);
};

2. 事件的类型

2.1 鼠标事件(12个)

事件类型说明
onmouseover鼠标刚进入元素时触发
onmouseenter鼠标完全进入元素时触发
onmousemove鼠标在元素上移动时触发
onmouseout鼠标刚要离开元素时触发
onmouseleave鼠标完全离开元素时触发
onmousedown鼠标按下时触发
onmouseup鼠标弹起时触发
onclick鼠标单击时触发
ondblclick鼠标双击时触发
onmousewheel当鼠标滚轮正在被滚动时运行的脚本
onscroll当元素滚动条被滚动时运行的脚本
oncontextmenu在用户点击鼠标右键打开上下文菜单时触发(右击)

2.2 表单事件(6个)

事件类型说明
onchange内容改变事件
onfocus获取焦点时触发的事件
onblur失去焦点时触发的事件
oninput输入事件
onsubmit表单提交事件
onreset表单重置事件

2.3 键盘事件(3个)

事件类型说明
onkeydown键盘按键按下时触发
onkeypress键盘按着不放时触发
onkeyup键盘按键弹起时触发

e.keyCode:获取输入键盘的键码,13回车

2.4 窗口事件(3个)

事件类型说明
onload文档及其资源文件都加载完成时触发
onresize事件会在窗口或框架被调整大小时发生。
onunload关闭网页时

3. 注册事件处理程序

3.1 通过HTML标签属性注册事件处理程序

<button onclick="alert('Hello World')">点我</button>

3.2 通过DOM元素属性注册事件处理程序

<button id="mybutton">点我</button>
<script> var mybutton = document.getElementById('mybutton');mybutton.onclick = function() { alert('Hello World');};mybutton.onclick = function() { alert('Hi');};
</script>

3.3 使用addEventListener()方法注册事件处理程序

  • addEventListener事件绑定、监听、捕获 ---》标准浏览器中有作用,非标准IE不兼容

  • 语法:元素.addEventListener(事件名,函数,true/false) true代表事件捕获,false代表事件冒泡。

  • 由于现在的浏览器都是执行事件冒泡,所以第三个参数通常写成false。

<button id="mybutton">点我</button>
<script>var mybutton = document.getElementById('mybutton');mybutton.addEventListener('click', function() { alert('Hello World'); }, false);mybutton.addEventListener('click', function() { alert('Hi'); }, false);
</script>

4. 事件处理程序

事件就是用户或浏览器自身执行的某种动作。比如click、load和mouseover,都是事件的名字。而相应事件的函数就叫做事件处理程序(或事件侦听器)。

4.1 添加事件处理程序的两种方法区别

  • 第一种:“on”加事件类型,如onclick、onload等;

var btn = document.getElementsByTagName("button")[0];
​
btn.onclick = function(){
​alert("点击事件被触发了1");
​
}

注意:通过上面这种方式添加事件,同一个类型的事件如果添加多次的话,只执行最后添加的事件。

  • 第二种是通过addEventListener()方法:

btn.addEventListener("dblclick", function(){alert("双击1");
});
​
btn.addEventListener("dblclick", function(){alert("双击2");
});

注意:同一种类型的事件可以添加多次,执行顺序是先添加会先执行,后面依次执行。

4.2 浏览器兼容性的事件绑定

function addMyEvent(ele, type, handleFun) {// 标准浏览器的方法if (ele.addEventListener) {console.log(1);ele.addEventListener(type, handleFun);// IE浏览} else if (ele.attachEvent) {console.log(2);ele.attachEvent('on' + type, handleFun);} else {console.log(3);ele['on' + type] = handleFun;}
};

4.3 移除事件绑定

1.null移除事件

 curEle.onclick= null;

2.具名函数的移除

function clickHandler(){};
curEle.addEventListener('click',clickHandler);
curEle.removeEventListener('click',clickHandler);

5. 事件的传递过程(事件冒泡)

JS和HTMl元素的交互几乎都是通过“事件”来完成的,事件从触发到完成响应一般分为3个阶段:捕获阶段,目标阶段和冒泡阶段。

  1. 捕获阶段:事件从根节点流向目标节点,途中流经各个DOM节点,在各个节点上触发捕获事件,直到达到目标节点。

  2. 目标(target)阶段:在此阶段中,事件传导到目标节点。浏览器在查找到已经指定给目标事件的监听器后,就会运行该监听器。

  3. 事件冒泡: 当为多个嵌套的元素设置了相同的事件处理程序,它们将触发事件冒泡机制。在事件冒泡中,最内部的元素将首先触发其事件,然后是栈内的下一个元素触发该事件,以此类推,直到到达最外面的元素。如果把事件处理程序指定给所有的元素,那么这些事件将依次触发。

    从图中我们可以知道                                                                                                                       1、一个完整的JS事件流是从window开始,最后回到window的一个过程                                     2、事件流被分为三个阶段(1-5)捕获过程、(5-6)目标过程、(6-10)冒泡过程

// 获取元素
var father = document.getElementsByClassName('father')[0];
var son = document.getElementsByClassName('son')[0];
// 浏览器很多事件默认支持冒泡
document.onclick = function() {console.log('document');
}
father.onclick = function() {console.log('father');
};
son.onclick = function() {console.log('son');
};

6. 阻止事件传播

使用事件对象的 stopPropagation() 方法停止事件传播。

7. 阻止默认事件

方法一:使用事件对象的 preventDefault() 方法阻止默认行为。

方法二:在事件的处理函数中返回 false。

8. 事件委托

原本绑定在子元素身上的事件,现在绑定到父元素上,利用事件冒泡的传递的过程,来触发当前的事件,这样的做法叫做事件委托,也叫事件代理。

9.javascript中常用坐标属性

9.1 MouseEvent属性

由鼠标事件(MouseEvent)可以发现: 其中包含了许多的坐标,且每个坐标的含义都不一样。下面我们来挨个介绍常用的坐标,以及它们的含义。

  • 1.clientX、clientY 点击位置距离当前body可视区域的x,y坐标

  • 2.pageX、pageY(不会随着滚动条的滚动而改变) 对于整个页面来说,包括了被卷去的body部分的长度,相对文档区域左上角距离

  • 3.screenX、screenY 点击位置距离当前电脑屏幕的x,y坐标

  • 4.offsetX、offsetY 鼠标相对于事件源元素的x,y坐标(光标相对于自身盒子内侧的坐标,不包括边框)

9.2 元素(HTMLElement)的offset属性(重点)

offset这个属性,可以说是非常有用的,顾名思义,offset翻译过来就是偏移量,从名字就可以看出它的具体意义了。也即是元素相当于父元素的偏移量。

  • 1.offsetTop: 元素相对父元素上边的偏移。(只读)

  • 2.offsetLeft: 元素相对父元素左边的偏移。(只读)

  • 3.offsetWidth: 自身包括padding 、 边框、内容区的宽度。

  • 4.offsetHeight: 自身包括padding、边框、内容区的高度。

  • 5.offsetParent: 作为偏移参照点的父级元素。

offsetLeft 和left 的区别

如果父div的position定义为relative,子div的position定义为absolute,那么子div的style.left的值是相对于父div的值,这同offsetLeft是相同的。

区别在于:

  • style.left 返回的是字符串,如28px,offsetLeft返回的是数值28,如果需要对取得的值进行计算, 还用offsetLeft比较方便。

  • style.left是读写的,offsetLeft是只读的,所以要改变div的位置,只能修改style.left。

9.3 元素的client属性

  • clientHeight(clientWidth):内容可视区域的高度/宽度,也就是说页面浏览器中可以看到内容的这个区域的高度(不含边框,也不包含滚动条等边线)

  • clientLeft,clientTop: 这两个返回的是元素周围边框的厚度,可以理解为边框的长度,如果不指定一个边框或者不定位改元素,他的值就是0.

9.4 元素的scroll 属性

scroll 翻译过来就是滚动的,我们使用 scroll 系列的相关属性可以动态的得到该元素的大小、滚动距离等。

9.5 元素的坐标属性总结

他们主要用法:

1.offset系列 经常用于获得元素位置    offsetLeft  offsetTop

2.client经常用于获取元素大小  clientWidth clientHeight

3.scroll 经常用于获取滚动距离 scrollTop  scrollLeft  

4.注意页面滚动的距离通过 window.pageYOffset  获得

9.6 window的坐标属性

  • window.innerWidth:返回以像素为单位的窗口的内部宽度。如果垂直滚动条存在,则这个属性将包括它的宽度。(只读)

  • window.innerHeight:返回以像素为单位的窗口的内部高度。如果有水平滚动条,也包括滚动条高度。(只读)

  • window.pageXOffset 获取当前页面相对于窗口显示区左上角的 X 位置。(页面滚动的距离)

  • window.pageYOffset 获取当前页面相对于窗口显示区左上角的 Y 位置。(只读)

  • window.screen.width记录了客户端显示屏的宽

  • window.screen.height记录了客户端显示屏的高

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

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

相关文章

【漏洞潜在风险】弹框干扰类风险

弹框干扰风险定义: 游戏过程中&#xff0c;客户端经常会以文字类形式对玩家进行说明和指引&#xff0c;而对于一些更为重要的信息&#xff0c;便会用游戏中的弹框进行强调。由玩家主动触发对其他玩家造成重复弹框进而干扰到正常游戏的都可以称之为弹框干扰类风险。弹框干扰风险…

C++项目——集群聊天服务器项目(六)MySQL模块

Hello&#xff0c;大家好啊&#xff0c;最近比较忙&#xff0c;没来得及更新项目&#xff0c;实在抱歉~今天就恢复更新拉~ 在验证完网络模块与业务模块代码可以正常使用后&#xff0c;需完成的操作是与底层数据库进行交互&#xff0c;为实现各类用户查询、增删业务奠定良好的基…

【群晖】白群晖如何公网访问

【群晖】白群晖如何公网访问 ——> 点击查看原文 在使用默认配置搭建好的群晖NAS后&#xff0c;我们可以通过内网访问所有的服务。但是&#xff0c;当我们出差或者不在家的时候也想要使用应该怎么办呢&#xff1f; 目前白群提供了两种比较快捷的方式&#xff0c;一种是直接注…

【Python系列】合并配置文件的最佳实践

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

python实现两个Excel表格数据对比、补充、交叉验证

业务背景 业务中需要用到类似企查查一类的数据平台进行数据导出&#xff0c;但企查查数据不一定精准&#xff0c;所以想采用另一个官方数据平台进行数据对比核验&#xff0c;企查查数据缺少的则补充&#xff0c;数据一致的保留企查查数据&#xff0c;不一致的进行颜色标注。 …

脱壳之常用的加固样本特征

梆梆加固样本特征 清单文件入口 android:name“com.SecShell.SecShell.ApplicationWrapper” 特征 免费版 meta-data meta-data总结 assets/secData0.jar lib/armeabi/libSecShell.so lib/armeabi/libSecShell-x86.so 梆梆企业版 assets/classes0.jar lib/armeabi-v7a/libD…

第一次运行 Python 项目,使用 python-pptx 提取 ppt 中的文字和图片

人工智能时代&#xff0c;最需要学习的编程语言是&#xff1a;python 。笔者是个 python 小白&#xff0c;昨天花了两个小时&#xff0c;第一次成功运行起来 python 项目 。 项目是 powerpoint-extractor &#xff0c;可以将 ppt 文件中的图片提取出来&#xff0c;并输出到固定…

Windows安装tomcat,以服务的方式管理,如何设置虚拟内存

之前工作中&#xff0c;部署tomcat都是使用Linux服务器&#xff0c;最近遇到个客户&#xff0c;提供的服务器是Windows server&#xff0c;并且需要通过服务的方式管理tomcat&#xff1b;以自己多年的码农经验&#xff0c;感觉应该没有问题&#xff0c;结果啪啪打脸了&#xf…

双向BFS

P1032 [NOIP2002 提高组] 字串变换 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 方法学自于B19 双向BFS 字串变换_哔哩哔哩_bilibili #include<iostream> #include<algorithm> #include<cstdio> #include<queue> #include<map> using namesp…

Adaboost集成学习 | Matlab实现基于BiLSTM-Adaboost双向长短期记忆神经网络结合Adaboost集成学习时间序列预测(股票价格预测)

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 Matlab实现基于BiLSTM-Adaboost双向长短期记忆神经网络结合Adaboost集成学习时间序列预测(股票价格预测) 模型设计 股票价格预测是一个具有挑战性的时间序列预测问题,可以使用深度学习模型如双向长短期记忆…

python爬虫之selenium4使用(万字讲解)

文章目录 一、前言二、selenium的介绍1、优点&#xff1a;2、缺点&#xff1a; 三、selenium环境搭建1、安装python模块2、selenium4新特性3、安装驱动WebDriver驱动选择驱动安装和测试 基础操作1、属性和方法2、单个元素定位通过id定位通过class_name定位一个元素通过xpath定位…

【OJ】动归练习五之子组串

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 1. 53. 最大子数组和1.1 分析1.2 代码 2. 918. 环形子数组的最大和2.1 分析2.2 代码 3. 152. 乘积最大子数组3.1 分析3.2 代码 4. 1567. 乘积为正数的最长子数组长度4.1 分析4.2 代码 1. 53. 最大子数组和 1.1 分析 一、…

密码学基础-对称密码/公钥密码/混合密码系统 详解

密码学基础-对称密码/公钥密码 加解密说明1.加密解密必要因素加密安全性说明 什么是对称密码图示说明对称密码详解什么是DES?举例说明 什么是3DES什么是AES? 公钥密码什么是RSA? 对称密钥和公钥密码优缺点对比对称密码对称密码算法总结对称密码存在的问题? 公钥密码公钥密码…

npm ERR! errno CERT_HAS_EXPIRED

1 问题描述 使用npm命令安装相关依赖报错&#xff1a;npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/vue%2fcli failed, reason: certificate has expired报错示例图如下所示&#xff1a; 2原因分析…

Spring Boot 整合分布式搜索引擎 Elastic Search 实现 自动补全功能

文章目录 ⛄引言一、分词器⛅拼音分词器⚡自定义分词器 二、自动补全查询三、自动补全⌚业务需求⏰实现酒店搜索自动补全 四、效果图⛵小结 ⛄引言 本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;…

谈一谈BEV和Transformer在自动驾驶中的应用

谈一谈BEV和Transformer在自动驾驶中的应用 BEV和Transformer都这么火&#xff0c;这次就聊一聊。 结尾有资料连接 一 BEV有什么用 首先&#xff0c;鸟瞰图并不能带来新的功能&#xff0c;对规控也没有什么额外的好处。 从鸟瞰图这个名词就可以看出来&#xff0c;本来摄像头…

阿里云Salesforce CRM功能差异列表 - Winter‘24

阉割版的阿里云Salesforce由于技术和监管等因素与国际版的Salesforce差距很大&#xff01; 一、Winter‘ 24版差异概况&#xff1a; 1.1. 主要版本&#xff1a; 阿里云上的 Salesforce 提供两个版本&#xff0c;用于生产用途的 CN 版本&#xff08;CN Edition&#xff09;和用…

day4 linux上部署第一个nest项目(java转ts全栈/3R教室)

背景&#xff1a;上一篇吧nest-vben-admin项目&#xff0c;再开发环境上跑通了&#xff0c;并且build出来了dist文件&#xff0c;接下来再部署到linux试试吧 dist文件夹是干嘛的&#xff1f; 一个pnpn install 直接生成了两个dist文件夹&#xff0c;前端admin项目一个&#xf…

Jenkins磁盘空间批量清理脚本

一、简介 Jenkins如果没有设置保留构建历史数&#xff0c;磁盘会随着使用次数增加而越来越满&#xff0c;于是需要批量清理一下。 二、清理脚本 找到Script Console 输入脚本&#xff0c;并点击执行&#xff0c;需要注意期望删除的构建历史编号&#xff08;可以查看下面的效果…

14. Springboot集成RabbitMQ

目录 1、前言 2、什么是RabbitMQ 3、安装RabbitMQ 4、Springboot集成RabbitMQ 4.1、添加依赖 4.2、添加配置 4.3、添加controller&#xff0c;作为生产者 4.4、设置生产者消息确认CallBack 4.5、添加Consumer&#xff0c;作为消费者 4.6、启动程序&#xff0c;访问 1…