,,详解JavaScript 事件流

,,详解JavaScript 事件流

本文主要介绍JavaScript事件流的相关信息,帮助大家更好的理解和学习JavaScript。感兴趣的朋友可以了解一下。

事件

HTML和javascript的交互是通过事件驱动来实现的,比如鼠标点击事件、页面滚动事件onscroll等。您可以向文档或文档中的元素添加事件侦听器来订阅事件。如果你想知道这些事件何时被调用,你需要知道“事件流”的概念。

事件流

事件描述从页面接收事件的顺序。但是早期的IE和网景提出了完全相反的事件流概念。IE事件流是事件冒泡,网景事件流是事件捕获。

事件流类别

事件冒泡

即自下而上,目标触发的元素一步步向上传播,直到窗口对象。

事件捕获

即自上而下,从文档到目标元素一步步进行。

后来ECMAScript进一步规范了DOM2中的事件流,基本上是以上两者的结合。

由DOM2二级事件指定的事件流包括三个阶段:

事件捕获阶段

处于目标阶段

事件冒泡阶段

注意:先捕获再冒泡,但是在目标节点上,谁写在前面谁就先执行。但是,在目标元素上冒泡和捕获是没有区别的,并且是按照绑定的顺序执行的。

DOM事件级别

有四个级别。

0: DOM0不是W3C规范。

DOM1:从W3C规范开始。重点是HTML文档和XML文档。

2.DOM2 1增加了一个样式表对象模型。

M3:在DOM3中增加了内容模型(DTD,Schemas)和文档验证。

DOM0级别0

DOM0 level 0事件有极好的跨浏览器优势,会尽快绑定。有以下两种绑定方法

内联绑定(内联模型)

将函数名直接用作html标记中属性的属性值。

Div onclick='btnClick()'按钮/div

脚本

函数btnClick(){

console . log(' hello ');

}

/脚本

动态绑定(脚本模型)

在JS中选择一个节点,然后向该节点添加onclick属性。

Div=' BTN '按钮/div

脚本

var BTN=document . getelementbyid(' BTN ');

btn.onclick=function(){

console . log(' click ');

}

/脚本

注意

在DOM0 level 0的同一个节点上只能添加一个同类型的事件,后面添加的同类型事件会覆盖前面的事件。

DOM0级别0仅支持冒泡。

DOM1级

DOM1级事件处理标准中没有定义事件相关的内容,所以不存在所谓的DOM1事件处理。

DOM2级

DOM2级别2定义了两个事件处理程序。(观察者模式)

AddEventListener() -添加一个事件侦听器

RemoveEventListener() -删除事件侦听器。

该函数有三个参数,第一个参数是要处理的事件的名称,第二个参数是事件处理程序的函数,第三个参数是一个布尔值。默认情况下false表示使用冒泡机制,true表示捕获机制。

Div=' BTN '按钮/div

脚本

var BTN=document . getelementbyid(' BTN ');

btn.addEventListener('click ',hello,false);

btn.addEventListener('click ',helloagain,false);

函数hello(){

console . log(' hello ');

}

函数helloagain(){

console.log('又见面了');

}

/脚本

//点击结果:

//你好

//又见面了

注意

如果定义了相同的监控方法,它将被覆盖。

Div=' BTN '点击/div

脚本

var BTN=document . getelementbyid(' BTN ');

btn.addEventListener('click ',hello,false);

btn.addEventListener('click ',hello,false);

函数hello(){

console . log(' hello ');

}

/脚本

//点击结果:

//你好

DOM3类

向DOM2添加了内容模型(DTD、模式)和文档验证。定义了一些新的事件,比如键盘事件,也可以自定义事件。

自定义事件

自定义事件不是由DOM本身触发的,其目的是让开发人员创建自己的事件。要创建的自定义事件可以由createEvent('CustomEvent ')创建;返回的对象有一个initCustomEvent()方法,该方法接收以下四个参数。

类型:字符串、触发事件类型、自定义。例如“keyDown”、“selected change”;

Bubble(布尔值):指示事件是否应该冒泡;

Cancelable(布尔值):指示事件是否可以取消;

Detail (object):任意值,保存在事件对象的Detail属性中;

您可以像分配其他事件一样,在DOM中分配创建的自定义事件对象。比如:

var div=document . getelementbyid(' my div ');

EventUtil.addEventHandler(div,' myEvent ',function () {

alert('div myEvent!');

});

event util . add eventhandler(document,' myEvent ',function(){

alert('记录我的事件!');

});

if(document . implementation . has feature(' custom events ',' 3.0 '){

var e=document . create event(' CustomEvent ');

e.initCustomEvent('myEvent ',true,false,' hello world!');

div . dispatch event(e);

}

在本例中,创建了一个冒泡事件“myEvent”。并将event.detail的值设置为一个简单的字符串,然后监听div和document上的事件,因为initCustomEvent中设置了事件冒泡。因此,当div触发事件时,浏览器会将事件冒泡到文档中。

阻止冒泡

停止传播功能

btn.addEventListener('click ',function(ev){

ev . stop propagation();

Console.log('停止冒泡')

},假)

事件委托(事件代理)

原理

如果有多个DOM节点需要监控事件,那么给每个DOM绑定一个monitor函数会极大地影响页面的性能,因为我们是通过事件委托来优化的,事件委托就是利用冒泡的原理。

保险商实验所

li1/李

li2/李

李/李

li4/李

li5/李

/ul

脚本

var Li _ list=document . getelementsbytagname(' Li ')

for(设索引=0;indexli _ list.length索引){

Li _ list[索引]。addEventListener('click ',函数(ev){

console . log(ev . current target . innerhtml)

})

}

/脚本

正常情况下,我们会为每一个li绑定一个事件,但如果此时动态渲染li,数据量极大,则需要在每次渲染后重新绑定(有新的情况),既繁琐又耗费性能;此时,我们可以将绑定事件委托给li的父元素,即ul。

var ul _ DOM=document . getelementsbytagname(' ul ')

ul_dom[0]。addEventListener('click ',函数(ev){

console . log(ev . target . innerhtml)

})

目标和当前目标之间的差异:

Target返回触发事件的元素,不一定是绑定事件的元素。

CurrentTarget返回绑定事件的元素。

优点

提高性能:每个函数都占用内存空间。只需添加一个事件处理程序代理所有事件,占用内存空间更少。

动态监控:使用事件委托可以自动绑定动态添加的元素,即新添加的节点可以拥有与其他元素相同的事件,而无需主动添加。

以上是JavaScript事件流的详细内容。关于JavaScript事件流的更多信息,请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: