前端架构师之11_JavaScript事件
1 事件处理
1.1 事件概述
在学习事件前,有几个重要的概念需要了解:
- 事件
- 事件处理程序
- 事件驱动式
- 事件流
事件
可被理解为是JavaScript侦测到的行为。
这些行为指的就是页面的加载、鼠标单击页面、鼠标滑过某个区域等。
事件处理程序
指的就是JavaScript为响应用户行为所执行的程序代码。
用户单击button按钮,这个行为就会被JavaScript中的click事件侦测到;然后让其自动执行,为click事件编写的程序代码,如在控制台输出“按钮被单击”。
事件驱动式
是指在Web页面中JavaScript的事件,侦测到的用户行为,并执行相应的事件处理程序的过程。
鼠标移入文本区域,文本区域变色这一过程。
事件流
事件发生时,会在发生事件的元素节点与DOM树根节点之间按照特定的顺序进行传播,这个事件传播的过程就是事件流。
网景(Netscape)提出了“事件捕获方式”、微软(Microsoft)提出了“事件冒泡方式”。
-
事件捕获方式(网景):事件流传播的顺序应该是从DOM树的根节点到发生事件的元素节点。
-
事件冒泡方式(微软):事件流传播的顺序应该是从发生事件的元素节点到DOM树的根节点。
W3C的解决方案
- 规定事件发生后,先实现事件捕获,但不会对事件进行处理。
- 接着进行到目标阶段,执行当前元素对象的事件处理程序,但它会被看成是冒泡阶段的一部分。
- 最后实现事件的冒泡,逐级对事件进行处理。
1.2 事件的绑定方式
事件绑定指的是为某个元素对象的事件绑定事件处理程序。
- 行内绑定式
- 动态绑定式
- 事件监听式
行内绑定式
事件的行内绑定式是通过HTML标签的属性设置实现的。
<标签名 事件="事件的处理程序">
- 标签名可以是任意的HTML标签,如
<div>标签、<button>标签等; - 事件是由on和事件名称组成的一个HTML属性,如单击事件对应的属性名为onclick;
- 事件的处理程序指的是JavaScript代码,如匿名函数等。
由于开发中提倡JavaScript代码与HTML代码相分离。因此,不建议使用行内式绑定事件。
动态绑定式
JavaScript代码与HTML代码混合编写的问题。
在JavaScript代码中,为需要事件处理的DOM元素对象,添加事件与事件处理程序。
DOM元素对象.事件 = 事件的处理程序;
事件的处理程序一般都是匿名函数或有名的函数。
行内绑定式与动态绑定式的异同
不同点:
- 实现语法不同,前者通过HTML标签的属性设置,后者在JS中处理DOM对象。
- 事件处理程序中关键字this的指向也不同。前者指向window对象,后者指向当前正在操作的DOM元素对象。
相同点:
- 同一个DOM对象的同一个事件只能有一个事件处理程序。
事件监听式
同一个DOM对象的同一个事件只能有一个事件处理程序,即可给同一个DOM对象的同一个事件添加多个事件处理程序。
实现方式有两种,具有兼容性问题,一类是早期版本的IE浏览器(如IE6~8),一类遵循W3C标准的浏览器(以下简称标准浏览器)。
// 早期版本的IE浏览器
DOM对象.attachEvent(type, callback);
- 参数type指的是为DOM对象绑定的事件类型,它是由on与事件名称组成的,如onclick。
- 参数callback表示事件的处理程序。
// 标准浏览器
DOM对象.addEventListener(type, callback, [capture]);
- 参数type指的是DOM对象绑定的事件类型,它是由事件名称设置的,如click。
- 参数callback表示事件的处理程序。
- 参数capture默认值为false,表示在冒泡阶段完成事件处理,将其设置为true时,表示在捕获阶段完成事件处理。
事件监听式的两种不同实现方式的区别
- 实现的语法不同。
- 事件处理程序的触发顺序也不相同,同一个对象的相同事件,早期版本IE浏览器的事件处理程序按照添加的顺序倒序执行。而标准浏览器的事件处理程序按照添加顺序正序执行。
事件监听的处理程序是一个有名的函数时,可移出事件监听。
- DOM对象.detachEvent(type, callback); // 早期版本IE浏览器
- DOM对象.removeEventListener(type, callback); // 标准浏览器
参数type值的设置要与添加事件监听的事件类型相同,参数callback表示事件处理程序的名称,即函数名。
2 事件对象
2.1 获取事件对象
当发生事件时,都会产生一个事件对象event。
这个对象中包含着所有与事件相关的信息,包括发生事件的DOM元素、事件的类型以及其他与特定事件相关的信息。
比如,因鼠标移动发生事件时,事件对象中就会包括鼠标位置(横纵坐标)等相关的信息;
获取事件对象的方式
- 早期IE浏览器(IE6~8):window.event
- 标准浏览器:会将一个event对象直接传入到事件处理程序中。
var event = e || window.event;
2.2 常用属性和方法
在事件发生后,事件对象event中不仅包含着与特定事件相关的信息,还会包含一些所有事件都有的属性和方法。
| 分类 | 属性/方法 | 描述 |
|---|---|---|
| 公有的 | type | 返回当前事件的类型,如click |
| 标准浏览器事件对象 | target | 返回触发此事件的元素(事件的目标节点) |
| 标准浏览器事件对象 | currentTarget | 返回其事件监听器触发该事件的元素 |
| 标准浏览器事件对象 | bubbles | 表示事件是否是冒泡事件类型 |
| 标准浏览器事件对象 | cancelable | 表示事件是否取消默认动作 |
| 标准浏览器事件对象 | eventPhase | 返回事件传播的当前阶段。1表示捕获阶段,2表示处于目标阶段,3表示冒泡阶段 |
| 标准浏览器事件对象 | stopPropagation() | 阻止事件冒泡 |
| 标准浏览器事件对象 | preventDefault() | 阻止默认行为 |
| 早期版本IE浏览器事件对象 | srcElement | 返回触发此事件的元素(事件的目标节点) |
| 早期版本IE浏览器事件对象 | cancelBubble | 阻止事件冒泡,默认为false表示允许,设置true表示阻止 |
| 早期版本IE浏览器事件对象 | returnValue | 阻止默认行为,默认为true表示允许,设置false表示阻止 |
var btn = document.getElementById('btn');
btn.onclick = function(e) {var obj = event.target || window.event.srcElement;console.log(obj.nodeName); console.log(obj.id);console.log(obj.className); console.log(obj.innerText);
};
// 事件冒泡
red.onclick = function() { console.log('red'); };
green.onclick = function() { console.log('green'); };
yellow.onclick = function() { console.log('yellow'); };
// 阻止事件冒泡
if (window.event) { // 早期IE浏览器window.event.cancelBubble = true;
} else { // 标准浏览器e.stopPropagation();
}
HTML中有些元素标签拥有一些特殊的行为。例如,单击 <a> 标签后,会自动跳转到href属性指定的URL链接;单击表单的submit按钮后,会自动将表单数据提交到指定的服务器端页面处理。因此,我们把标签具有的这种行为称为默认行为。
<a id="test" href="http://www.example.com">默认链接</a>
<script>document.getElementById('test').onclick = function(e) {if (window.event) { // 早期版本IE浏览器window.event.returnValue = false;} else { //标准浏览器e.preventDefault();}};
</script>
2.3 练习作业
- 缓动的小球
- 动画特效:是JavaScript的常见功能之一。
- 缓动的实现原理:通过定时器连续的修改当前DOM元素的某个样式值,达到一个动态的特效。
- 缓动动画公式:
- 计算每次缓动的步长 step = ( target - leader ) / 10
- 计算下次的起始点 leader = leader + step
- target 表示目标点。
- leader 表示起始点。
- step 表示从起始点到目标点每次缓动的步长。而缓动特效在实现时,随着距离 target 越来越近,step 步长值逐渐变小,从而达到非常逼真的缓动效果。
- 利用
<div>设计小球,并用 CSS 设置小球的定位。 - 为小球绑定单击事件,在处理函数中调用自定义的 animate() 实现小球的缓动。
- 编写 animate() 动画函数,在函数中利用定时器,根据缓动公式完成缓动动画。
3 事件分类
3.1 页面事件
HTML页面是按照什么样的顺序进行加载的?
页面的加载是按照代码的编写顺序,从上到下依次执行的。
会出现的问题:若在页面还未加载完成的情况下,就使用JavaScript操作DOM元素,会出现语法错误。
<!-- 页面加载顺序的问题-->
<script>document.getElementById('demo').onclick = function () {console.log('单击');};
</script>
<div id="demo"></div>
解决办法:页面事件可以改变JavaScript代码的执行时机。
- load事件:用于body内所有标签都加载完成后才触发,又因其无需考虑页面加载顺序的问题,常常在开发具体功能时添加。
- unload事件:用于页面关闭时触发,经常用于清除引用避免内存泄漏时使用。
window.onload = function() {// JavaScript代码
};
3.2 焦点事件
在Web开发中,焦点事件多用于表单验证功能,是最常用的事件之一。
例如,文本框获取焦点改变文本框的样式,文本框失去焦点时验证文本框内输入的数据等。
| 事件名称 | 事件触发时机 |
|---|---|
| focus | 当获得焦点时触发(不会冒泡) |
| blur | 当失去焦点时触发(不会冒泡) |
3.3 鼠标事件
鼠标事件是Web开发中最常用的一类事件。
例如,鼠标滑过时,切换Tab栏显示的内容;利用鼠标拖拽曳状态框,调整它的显示位置等,这些常见的网页效果都会用到鼠标事件。
| 事件名称 | 事件触发时机 |
|---|---|
| click | 当按下并释放任意鼠标按键时触发 |
| dblclick | 当鼠标双击时触发 |
| mouseover | 当鼠标进入时触发 |
| mouseout | 当鼠标离开时触发 |
| change | 当内容发生改变时触发,一般多用于 <select> 对象 |
| mousedown | 当按下任意鼠标按键时触发 |
| mouseup | 当释放任意鼠标按键时触发 |
| mousemove | 在元素内当鼠标移动时持续触发 |
在项目开发中还经常涉及一些常用的鼠标属性,用来获取当前鼠标的位置信息。
| 位置属性(只读) | 描述 |
|---|---|
| clientX | 鼠标指针位于浏览器页面当前窗口可视区的水平坐标(X轴坐标) |
| clientY | 鼠标指针位于浏览器页面当前窗口可视区的垂直坐标(Y轴坐标) |
| pageX | 鼠标指针位于文档的水平坐标(X轴坐标),IE6~8不兼容 |
| pageY | 鼠标指针位于文档的垂直坐标(Y轴坐标),IE6~8不兼容 |
| screenX | 鼠标指针位于屏幕的水平坐标(X轴坐标) |
| screenY | 鼠标指针位于屏幕的垂直坐标(Y轴坐标) |
IE68浏览器中不兼容pageX和pageY属性。因此,项目开发时需要对IE68浏览器进行兼容处理。
var pageX = event.pageX || event.clientX + document.documentElement.scrollLeft;
var pageY = event.pageY || event.clientY + document.documentElement.scrollTop;
鼠标在文档中的坐标等于鼠标在当前窗口中的坐标加上滚动条卷去的文本长度。
3.4 作业练习
-
鼠标拖曳特效
- 盒子的位置(left和top值)= 鼠标的位置(left和top值)- 鼠标按下时与盒子之间的距离(left和top值)。
- 编写HTML,设计弹框用于实现拖拽特效。
- 为拖拽条添加mousedown事件及其处理程序。
- 处理鼠标移动事件,实现鼠标的拖拽的特效。
- 处理释放鼠标按键的事件,实现鼠标按钮松开后,弹框不再移动。
3.5 键盘事件
键盘事件是指用户在使用键盘时触发的事件。
例如,用户按Esc键关闭打开的状态栏,按Enter键直接完成光标的上下切换等。
| 事件名称 | 事件触发时机 |
|---|---|
| keypress | 键盘按键(Shift、Fn、CapsLock等非字符键除外)按下时触发 |
| keydown | 键盘按键按下时触发 |
| keyup | 键盘按键弹起时触发 |
keypress事件保存的按键值是ASCII码,keydown和keyup事件保存的按键值是虚拟键码。
3.6 表单事件
表单事件指的是对Web表单操作时发生的事件。
例如,表单提交前对表单的验证,表单重置时的确认操作等。JavaScript提供了相关的表单事件。
| 事件名称 | 事件触发时机 |
|---|---|
| submit | 当表单提交时触发 |
| reset | 当表单重置时触发 |
4 练习作业
- 图片放大特效
- 准备两张相同的图片,小图和大图。
- 小图显示在商品的展示区域。
- 大图用于鼠标在小图上移动时,按比例的显示大图中的对应区域。
- 编写HTML页面,展示小图、隐藏鼠标的遮罩及大图。
- 当鼠标在小图上移动时,显示鼠标的遮罩和大图。
- 当鼠标移动时,让遮罩跟着在小图中进行移动。
- 限定遮罩在小图中的可移动范围。
- 根据遮罩在小图中的覆盖范围,按比例的显示大图。
的确认操作等。JavaScript提供了相关的表单事件。
| 事件名称 | 事件触发时机 |
|---|---|
| submit | 当表单提交时触发 |
| reset | 当表单重置时触发 |
4 练习作业
- 图片放大特效
- 准备两张相同的图片,小图和大图。
- 小图显示在商品的展示区域。
- 大图用于鼠标在小图上移动时,按比例的显示大图中的对应区域。
- 编写HTML页面,展示小图、隐藏鼠标的遮罩及大图。
- 当鼠标在小图上移动时,显示鼠标的遮罩和大图。
- 当鼠标移动时,让遮罩跟着在小图中进行移动。
- 限定遮罩在小图中的可移动范围。
- 根据遮罩在小图中的覆盖范围,按比例的显示大图。
相关文章:
前端架构师之11_JavaScript事件
1 事件处理 1.1 事件概述 在学习事件前,有几个重要的概念需要了解: 事件事件处理程序事件驱动式事件流 事件 可被理解为是JavaScript侦测到的行为。 这些行为指的就是页面的加载、鼠标单击页面、鼠标滑过某个区域等。 事件处理程序 指的就是Java…...
文本过滤工具:grep
什么是grep? grep是一个命令行文本搜索工具,它的名称来源于"Global Regular Expression Print"(全局正则表达式打印)。它的主要功能是在文本文件中查找特定模式或字符串,并将匹配的行打印到终端或输出到文件…...
【Linux】生产者和消费者模型
生产者和消费者概念基于BlockingQueue的生产者消费者模型全部代码 生产者和消费者概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。 生产者和消费者彼此之间不直接通讯,而通过这个容器来通讯,所以生产者生产完数据之后不用等待…...
开发APP的费用是多少
开发一款APP的费用可以因多种因素而异,包括项目的规模、功能、复杂性、技术选择、地理位置等。北京是中国的大城市,APP开发的费用也会受到北京的物价水平和市场竞争的影响。以下是一些可以影响APP开发费用的因素,希望对大家有所帮助。北京木奇…...
start()方法源码分析
当我们创建好一个线程之后,可以调用.start()方法进行启动,start()方法的内部其实是调用本地的start0()方法, 其实Thread.java这个类中的方法在底层的Thread.c文件中都是一一对应的,在Thread.c中start0方法的底层调用了jvm.cpp文件…...
VUE_history模式下页面404错误
uniapp 的history 把#去掉了,但是当刷新页面的时候出现404错误 解决方案:需要服务端支持 如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面 Apache <IfModule mod_rewrite.c>RewriteEngine OnRewriteBase /RewriteRu…...
现代数据架构-湖仓一体
当前的数据架构已经从数据库、数据仓库,发展到了数据湖、湖仓一体架构,本篇文章从头梳理了一下数据行业发展的脉络。 上世纪,最早出现了关系型数据库,也就是DBMS,有商业的Oracle、 IBM的DB2、Sybase、Informix、 微软…...
最新AI写作系统ChatGPT源码/支持GPT4.0+GPT联网提问/支持ai绘画Midjourney+Prompt应用+MJ以图生图+思维导图生成
一、智能创作系统 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧&…...
Python机器学习实战-特征重要性分析方法(5):递归特征消除(附源码和实现效果)
实现功能 递归地删除特征并查看它如何影响模型性能。删除时会导致更大下降的特征更重要。 实现代码 from sklearn.ensemble import RandomForestClassifier from sklearn.feature_selection import RFE import pandas as pd from sklearn.datasets import load_breast_cance…...
如何快速走出网站沙盒期(关于优化百度SEO提升排名)
网站沙盒期是指新建立的网站在百度搜索引擎中无法获得好的排名,甚至被完全忽略的现象。这个现象往往发生在新建立的网站上,因为百度需要时间来评估网站的质量和内容。蘑菇号www.mooogu.cn 为了快速走出网站沙盒期,需要优化百度SEO。以下是5个…...
ATA-8000系列射频功率放大器——应用场景介绍
ATA-8000系列是一款射频功率放大器。其P1dB输出功率500W,饱和输出功率最大1000W。增益数控可调,一键保存设置,提供了方便简洁的操作选择,可与主流的信号发生器配套使用,实现射频信号的放大。 图:ATA-8000系…...
2009-2018年各省涉农贷款数据(wind)
2009-2018年各省涉农贷款数据(wind) 1、时间::209-2018年 2、范围:31省 3、来源:wind 4、指标:涉农贷款 指标解释 :在涉农贷款的分类上,按照城乡地域将涉农贷款分为农村贷款和城…...
window.print()打印及出现的问题
<template><transition name"el-zoom-in-center"><div class"JNPF-preview-main"><div class"JNPF-common-page-header"><el-page-header back"goBack" :content"打印通知书" /><div clas…...
Fedora Linux 39 Beta 预估 10 月底发布正式版
Fedora 39 Beta 镜像于今天发布,用户可以根据自己的使用偏好,下载 KDE Plasma,Xfce 和 Cinnamon 等不同桌面环境版本,正式版预估将于 10 月底发布 Fedora 39 Beta 版本主要更新了 DNF 软件包管理器,并优化了 Anaconda …...
【zookeeper】基于Linux环境安装zookeeper集群
前提,需要有几台linux机器,我们可以准备好诸如finalshell来连接linux并且上传文件; 其次Linux需要安装上ssh,并且在/etc/hosts文件中写好其他几台机器的名字和Ip 127.0.0.1 localhost localhost.localdomain localhost4 localh…...
什么是IoT数字孪生?
数字孪生是资产或系统的实时虚拟模型,它使用来自连接的物联网传感器的数据来创建数字表示。数字孪生允许您从任何地方实时监控设备、资产或流程。数字孪生用于多种目的,例如分析性能、监控问题或在实施之前运行测试。从物联网数字孪生中获得的见解使用户…...
俄罗斯四大平台速卖通、Joom、Ozon 和 UMKA中国卖家如何脱颖而出!
随着全球化的不断推进,越来越多的中国卖家将目光投向了俄罗斯这个广阔的市场。在众多的跨境电商平台中,速卖通、Joom、Ozon 和 UMKA 无疑是最受关注的四个平台。本文将从卖家的角度,详细分析这四大平台的特点和优势,帮助找到最…...
destoon 调用第三方api接口
调用企查查企业工商信息接口为例: 在 \api\extend.func.php 文件下 注意:有注释内容可能接口无法访问 function select_list($k){$query_data array(key>,keyword>$k);$url "https://api.qichacha.com/ECIV4/GetBasicDetailsByName?&q…...
js中的类型转换
原文地址 JavaScript 中有两种类型转换:隐式类型转换(强制类型转换)和显式类型转换。类型转换是将一个数据类型的值转换为另一个数据类型的值的过程。 隐式类型转换(强制类型转换): 隐式类型转换是 Java…...
Oracle物化视图(Materialized View)
与Oracle普通视图仅存储查询定义不同,物化视图(Materialized View)会将查询结果"物化"并保存下来,这意味着物化视图会消耗存储空间,物化的数据需要一定的刷新策略才能和基表同步,在使用和管理上比…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
