Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JavaScript的事件

JavaScript的事件

作者头像
小小鱼儿小小林
发布于 2020-06-24 02:59:14
发布于 2020-06-24 02:59:14
1.5K00
代码可运行
举报
文章被收录于专栏:灵儿的笔记灵儿的笔记
运行总次数:0
代码可运行

javascript与HTML之间的交互是通过事件实现的。事件就是文档或浏览器窗口中发生的一些特定的交互瞬间。

事件三要素:

事件目标(event target)

发生的事件与之相关联或与之相关的对象

事件处理程序(event handler)

处理或相应事件的函数

事件对象(event object)

与特定事件相关且包含有关该事件详细信息的对象。

1) 事件流

描述的是从页面中接受事件的顺序

1. 事件冒泡 (IE事件流)

事件开始由最具体的元素接收,然后逐级向上传播到不具体的节点。

是从里往外逐个触发

<html>

<head></head>

<body>

<div>click me</div>

</body>

</html>

当点击了<div>元素,这个click事件会按照如下顺序传播

div->body->html->document

注意:IE8以及更早版本只支持事件冒泡。

2. 事件捕获 (Netscape事件流)

不太具体的节点更早接收事件,具体的节点到最后接收事件。

是从外往里逐个触发

当点击了<div>元素,按照如下方式触发click事件

document->html->body->div

注意:IE9,Safari,Chrome,Opera,Firefox目前也都支持事件捕获,但是由于老版本的浏览器不支持事件捕获,因此很少有人使用事件捕获。建议大家放心使用事件冒泡!

现代的浏览器默认情况下都是冒泡模型,而捕获模式则是早期的Netscape默认情况。而现在的浏览器要使用DOM2级模型的事件绑定机制才能手动定义事件流模式。

3. DOM事件流

“DOM2级事件”规定了事件流包括三个阶段:事件捕获阶段,处理目标阶段和事件冒泡阶段。首先发生的是事件捕获,为截获事件提供了机会。然后是实际的目标接收到事件。最后是事件冒泡。

事件捕获: document->html->body

处理目标: 事件处理

事件冒泡: div->body->html->document

2) 事件处理程序

事件就是用户或浏览器自身执行的某种动作,响应某个事件的函数为事件处理程序,事件处理程序以"on"开头(onclick,onload)

1. HTML事件处理程序

某个元素支持的每种事件,都可以使用一个与相应事件处理程序同名的HTML特性来指定。这个特性的值应该是能够执行的JavaScript代码。

<input type="button" value="clickMe" onclick = "alert('is clicked')">

不能在事件中使用未经转义的HTML语法字符

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input type="button" value="clickMe" onclick = "showMsg()">
<script type="text/javascript">
function showMsg(){
alert("is clicked");
}
</script>

点击按钮会调用showMsg()函数,事件处理程序的代码在执行时,有权访问全局作用域的任何代码。

缺点:

1)时差问题,用户可能会在HTML元素一出现在页面上就触发相应的事件,但当时的事件处理程序有可能尚不具备执行的条件。

2)这种扩展事件处理程序的作用域链在不同浏览器中会导致不同结果。

3)HTML与JavaScript代码紧密耦合。

2. DOM0级事件处理程序

通过javascript制定事件处理程序的传统方式,将一个函数赋值给一个事件处理程序属性。特点是简单,跨浏览器。

var btn = document.getElementById("btn");

btn.onclick = function(){

alert('cliked');

}

dom0级方法制定的事件处理程序被认为是元素的方法,因此这个时候时间处理程序是在元素的作用域中运行,this指向当前元素。

btn.onclick = null; //删除事件处理程序

3. DOM2级事件处理程序

DOM2级规范以一种符合逻辑的方式来标准化DOM事件,IE9,Firefox,Opera,Safari,Chrome全部已经实现了"DOM2级事件"模块的核心部分。IE8是最后一个仍然使用其专有事件系统的主要浏览器。

addEventListener()

事件绑定

参数:

要绑定的事件名

作为事件处理的函数

布尔值:true在捕获阶段调用事件处理程序;false在冒泡阶段调用

removeEventListener()

事件删除

参数:

要删除的事件名

作为事件处理的函数

布尔值:true在捕获阶段调用事件处理程序;false在冒泡阶段调用

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  //事件绑定
var btn = document.getElementById("btn");
btn.addEventListener("click",function(){
alert(this.id); //该函数在其依附的元素的作用域中运行。
},false);
//事件移除
var btn = document.getElementById("btn");
var handler = function(){
alert(this.id);
}

btn.addEventListener("click",handler,false);

btn.removeEventListener("click",handler,false);//移除

可以添加多个事件处理程序,并且按照添加她们的顺序触发。移除事件传入的参数与添加处理程序时使用的参数相同,添加事件时如果使用匿名函数将无法删除

4. IE事件处理程序

事件处理程序会在全局作用域中运行,因此this指向window对象。为一个对象添加两个相同的事件,事件处理程序的顺序是按照添加相反顺序进行处理

attachEvent()

事件绑定

参数:

事件处理程序名称

事件处理函数

detachEvent()

事件移除

参数:

事件处理程序名称

事件处理函数

事件处理程序都被添加到冒泡阶段

5. 跨浏览器的事件处理程序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var EventUtil = {
//添加事件
bind : function
(element,type,handler){
if(element.addEventListener){
element.addEventListener(type,handler,false);
}else if(element.attachEvent){
element.attachEvent("on"+type,handler)
}else{
element["on"+type] = handler
}
},
//移除事件
unbind : function(element,type,handler){
if(element.removeEventListener){
element.removeEventListener(type,handler,false);
} else if(element.detachEvent){
element.detachEvent("on"+type,handler)
} else{
element["on"+type] = null;
}
}
}

3) 事件对象

1. DOM中的事件对象

在触发DOM上的某个事件时,会产生一个事件对象event,这个对象包含着所有与事件相关的信息,包括导致事件的元素,事件的类型以及其他与特定事件相关的信息。兼容DOM的浏览器默认会将event对象传入到事件处理函数中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
       dom.onclick = function(event){
    console.log(event);
       }
       dom.addEventListener("click",function(event){
    console.log(event);      
       },false);

事件对象的属性均为只读属性。

属性 类型 说明

bubbles Boolean 事件是否冒泡

cancelable Boolean 是否可以取消事件默认行为

currentTarget Element 事件处理程序当前正在处理事件的那个元素

eventPhase Integer 调用事件处理程序的阶段;1,捕获 2,处于目标 3,冒泡

target Element 事件真正目标

type String 事件类型,需要一个函数处理多个事件时,可以使用该属性。

preventDefault() Function 取消事件的默认行为

stopPropagation() Function 取消事件的进一步捕获或者冒泡

在事件处理程序内部,对象this始终等于currentTarget值,而target则只包含事件的实际目标。如果直接将事件处理程序指定给了目标元素,this,currentTarget,target包含相同的值。

2. IE中的事件对象

在使用DOM0级方法添加事件时,event对象可以作为window对象的一个属性存在,使用attachEvent添加事件处理程序的时候,event对象会作为参数传入事件处理函数中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dom.onclick = function(){
console.log(window.event);
window.event.returnValue = false;//阻止默认行为
window.event.cancalBubble = true;//取消冒泡
   }
   dom.attachEvent("onclick",function(event){
console.log(window.event);
   });

属性 类型 说明

cancelBubble Boolean 是否取消事件冒泡,值为true取消冒泡,类似stopPropagation()

returnValue Boolean 取消事件默认行为,值为false阻止,类似preventDefault()

srcEvent Element 时间的目标 target

type String 被触发的时间 的类型

3. 跨浏览器的事件对象

事件对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//返回事件对象
getEvent: function(event){
return event? event : window.event;
}

目标对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//获取目标
getTarget:function(event){
return event.target || event.srcElement;
}

阻止默认行为

阻止冒泡

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
stopPropagation : function(event){
if(event.stopPropagation){
event.stopPropagation();
}else{
event.cancelBubble = true;
}
}

4) 事件类型

1. UI事件

load

当页面完全加载后再window上触发,当所有框架加载完毕时在框架集上触发,当图像加载完毕时在img元素上触发,当嵌入的内容加载完时在<object>触发

unload

当页面完全卸载后再window上触发,当所有框架都卸载后在框架集上触发,当嵌入的内容卸载完毕后再<object>上触发,(firefox不支持)

select

当用户选择文本框(<input>,<textarea>)中的一个或多个字符时

resize

当浏览器窗口被调整到一个新的高度或者宽度时,会触发

scroll

当用户滚动带滚动条的元素中的内容时,在该元素上触发resize,scroll会在变化期间重复被激发,尽量保持代码简单

2. 焦点事件

blur

元素失去焦点的时候触发

focus

元素获得焦点的时候触发,不支持冒泡

//IE支持

focusin

与focus等价,支持冒泡

focusout

与blur等价,支持冒泡

3. 鼠标与滚轮事件

click

点击主鼠标按钮或者按下回车按键的时候触发。只有在一个元素上相继发生mousedown,mouseup事件,才会触发click事件

dblclick

双击主鼠标按钮时触发.只有在一个元素上相继触发两次click时间才会触发dbclick事件

mousedown

任意鼠标按钮按下时触发

mouseup

释放鼠标按钮触发

mousemove

鼠标在元素内部移动的时候重发触发

mousewheel

滚轮事件

mouseover

鼠标位于元素外部,将其首次移入另一个元素边界之内时触发【支持子元素】

mouseenter

鼠标光标从元素外部首次移动到元素范围内激发,不冒泡。【不支持子元素】

mouseout

在位于元素上方的鼠标光标移入到另外一个元素中。【支持子元素】在被选元素上与mouseleave效果相同

mouseleave

在位于元素上方的鼠标光标移动到元素范围之外时触发,不冒泡【不支持子元素】

4. 相关元素,event特殊属性

1.客户区坐标位置

clientX,clientY 事件发生时,鼠标指针在视口中的水平和垂直坐标

2.页面坐标位置

pageX,pageY 事件发生时,鼠标指针在页面本身而非视口的坐标,页面没有滚动的时候,pageX和pageY的值与clientX和clientY值相等

3.屏幕位置

screenX,screenY

4.修改键

值为boolean类型,用来判断对应的按键是否被按下

shiftKey

ctrlKey

altKey

metaKey

5.鼠标按钮

mousedown,mouseup,该事件的event对象中包含了button属性,表示按下或释放的按钮。

0表示主鼠标按钮

1表示中间的滚动按钮

2表示次鼠标按钮

5. 键盘与文本事件

keydown 按下键盘任意键时触发,如果按住不放会重复触发此事件

keypress 按下键盘字符键时触发,如果按住不放会重复触发此事件

keyup 释放键盘上键时触发

当键盘事件发生时,event对象的keyCode属性中会包含一个代码与键盘上的特定键对应,对数字字母键,keyCode属性的值与ASCII码中对应的小写字母和数字编码相同

详见keycode.txt

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/09/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
「面试常问」系统理解浏览器之事件机制
在早期 IE 和 Netscape 团队在开发第四代浏览器的时候,遇到一个问题:当点击一个按钮的时候,是应该先处理父级的事件呢?还是应该先处理按钮的事件呢?IE 和 Netscape 给出了 2 种完全相反的答案,IE 提出事件冒泡的概念,而 Netscape 则支持事件捕获。
用户4456933
2021/06/01
5830
「面试常问」系统理解浏览器之事件机制
JavaScript事件探秘
事件流描述的是从页面中接收事件的顺序。IE的事件流是事件冒泡流,而Netscape的事件流是事件捕获流
张张
2019/12/26
9320
【JS】395-重温基础:事件
事件流描述的是从页面中接收事件的顺序,通常有这样两种完全相反的事件流概念:事件冒泡流(IE团队提出)和事件捕获流(网景团队提出)。
pingan8787
2019/11/05
1.1K0
事件
JavaScript与HTML之间的交互式通过事件实现的。 事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间。可以使用侦听器(或处理程序)来预订事件,以便事件发生时执行相应的代码。
奋飛
2019/08/15
3.4K0
事件
事件 JavaScript和HTML的交互是通过事件实现的。JavaScript采用异步事件驱动编程模型,当文档、浏览器、元素或与之相关对象发生特定事情时,浏览器会产生事件。如果JavaScript关注特定类型事件,那么它可以注册当这类事件发生时要调用的句柄。事件是某个行为或者触发,比如点击、鼠标移动..... 当用户点击鼠标时 当网页已加载时 当图像已加载时 当鼠标移动到元素上时 当用户触发按键时... 事件流 事件流描述的是从页面中接收事件的顺序,比如有两个嵌套的div,点击了内层的div,这时候是内层
小胖
2018/06/27
1.4K0
javascript事件详解
事件流 事件流两种顺序:冒泡与捕获。 简单的添加与删除事件 obj.onclick=function(){} obj.onclick=null; 通用事件添加的删除 obj.addEventListener(),obj.attachEvent() obj.removeEventListener(),obj.attachEvent() 三个参数分别表示,(事件,绑定函数,事件流), 注意: 1.如果必须得删除事件,这种写法,不能用匿名函数,否则删除函数的时候,不方便。 2.attachEvent的事件名称是o
前朝楚水
2018/04/02
1.4K0
面试官:考你几个简单的事件问题吧
事件处理是JavaScript中非常重要的概念,我们使用的客户端软件往往都是事件驱动的,所以面试官特别喜欢问一些事件相关的知识,这里记录几个常见的问题,供大家学习。
kai666666
2020/10/19
1.2K0
javascript 事件基础
一:事件流       事件流描述的是从页面中接收事件的顺序。  事件冒泡 <div id="one"> <div id="two"> <div id=
柴小智
2018/04/10
9750
javascript 事件基础
深入理解事件
javascript 给 DOM 绑定事件处理函数总的来说有2种方式:在 html 文档中绑定、在 js 代码中绑定。下面的方式1、方式2属于在 html 中绑定事件,方式3、方式4和方式5属于在js代码中绑定事件,其中,方式4和5属于事件监听,而方式5是最推荐的做法。
Chor
2019/11/08
8760
DOM事件基本概念大总结(前端必备)
事件流 这一概念源自于对事件触发对象的思考。例如常见的点击事件,鼠标移动事件。这些事件发生之时,往往不只是点击或者移动到某一特定元素上。 比如点击某一个按钮,而它是由上一层的父标签,或许在上一层还有父标签甚至是整个页面。因此点击一个元素可以看成是同时点击了父标签或者整个页面。那么此时事件应该怎么响应到指定标签呢? 事件冒泡 即事件从指定元素开始传播到最外层的元素,并且该事件不仅会在指定元素上发生,还会在传播过过程中的每一个元素上发生。 <html> <body> <div>
努力的Greatiga
2022/07/25
1.9K0
DOM事件探索
1.HTML事件处理程序 2.DOMO级事件处理程序 3.DOM2级事件处理程序
1025645
2018/08/23
4700
JavaScript——DOM事件高级
此方法将指定的监听器注册到eventTarger(目标对象)上,当该对象触发指定的事件时,就会执行事件处理函数。
岳泽以
2022/10/26
1.9K0
JavaScript——DOM事件高级
JavaScript(十二)
这一篇,我们讲讲 JavaScript 中非常重要的概念 —— 事件。 JavaScript 与 HTML 之间的交互是通过事件实现的。
1ess
2021/11/01
3.1K0
Web前端事件
何雪斌
2017/05/17
3.4K0
Web前端事件
JavaScript事件
JavaScript事件 对于事件来讲,首先,我们需要了解这样几个概念:事件;事件处理程序;事件类型;事件流;事件冒泡;事件捕获;事件对象;事件模拟,事件方面的性能优化(事件委托、移除事件处理程序); 事件的概念 事件:指的是文档或者浏览器窗口中发生的一些特定交互瞬间。我们可以通过监听器(或者处理程序)来预定事件,以便事件发生的时候执行相应的代码。 事件处理程序:我们用户在页面中进行的点击这个动作,鼠标移动的动作,网页页面加载完成的动作等,都可以称之为事件名称,即:click、mousemove、loa
汤高
2018/01/11
2.1K0
JavaScript事件
《现代Javascript高级教程》深入理解事件处理和传播机制
JavaScript中的事件流是一种机制,用于描述和处理事件在DOM树中的传播过程。了解事件流的属性和工作原理对于编写高效的事件处理代码和实现复杂的交互功能至关重要。本文将详细介绍JavaScript事件流的发展流程、属性以及应用场景,并提供一些代码示例和引用资料,帮助读者深入理解并应用这一重要的前端技术。
linwu
2023/07/27
2760
事件
利用 on 开头的事件,如 onclick, 同一个元素同一个事件只能设置一个处理函数,出现多个处理函数的话,后面的会覆盖前面的。
赤蓝紫
2023/01/01
1.4K0
事件
js 事件笔记
在Web中, 事件在浏览器窗口中被触发,执行事先绑定的事件处理器(也就是事件触发时会运行的代码块),对事件做出响应。 用户在浏览器的任何一个操作都会去触发一个事件,JavaScript采用异步事件驱动编程模型,当文档、浏览器、元素或与之相关对象发生特定事情时,浏览器会产生事件。
bamboo
2019/01/29
11.3K0
js 事件笔记
JS事件流
HTML中与javascript交互是通过事件驱动来实现的,例如鼠标点击事件、页面的滚动事件onscroll等等,可以向文档或者文档中的元素添加事件侦听器来预订事件。想要知道这些事件是在什么时候进行调用的,就需要了解一下“事件流”的概念。
前端逗逗飞
2021/04/30
8.7K0
JS事件流
事件高级
给元素添加事件,称为注册事件或者绑定事件。 注册事件有两种方式:传统方式和方法监听注册方式
梨涡浅笑
2022/05/08
1.3K0
事件高级
相关推荐
「面试常问」系统理解浏览器之事件机制
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验