JavaScript 事件处理机制
网景提出事件捕获(event capturing)的事件流。事件会从DOM模型的最外层开始发生,直到内部触发事件的元素为止。
当 button 单击时: document -> html -> body -> button
事件冒泡
微软提出了事件冒泡(event bubbling)
的事件流。事件会从触发事件的元素开始,一直向上层传播,直到 document 元素。事件冒泡可以形象地理解为:一颗石头投入水中,泡泡从水底冒出,越变越大。
-> body -> html -> document
最终标准
后来 w3c 采用折中的方式,统一的标准: 先捕获再冒泡。然而,并非所有的事件都会经过冒泡阶段,比如 focus/blur 事件就不会冒泡.
//useCapture 是否使用事件捕方式,默认为 false (冒泡) ,在这里只展示了 addEventListener 最基本应用.
element.addEventListener(event, function, useCapture)
element.addEventListener 可以给绑定多次.同时也调用 element.removeEventListener 移除绑定事件,而 element.onclick = funcA 形式,只会以最后一个绑定为准.
总体上来说,事件捕获先于事件冒泡, 即当一个元素绑定了两种事件传播方式的处理函数时,无论代码书写顺序如何,总是先执行捕获后执行冒泡.但这也并非绝对,当该元素同时是触发事件的元素时,则以代码书写顺序为准.
示例: 下面代码,有子父级两个元素,其中父级元素绑定了两种传播方式的回调.
当单击子元素时: click-parent--事件捕获 --> click-child---事件冒泡 --> click-parent--事件冒泡
当单击父元素时: click-parent--事件冒泡 --> click-parent--事件捕获
document.getElementById('parent').addEventListener("click",function(e){
console.log("click-parent---事件冒泡");
},false);
document.getElementById('parent').addEventListener("click",function(e){
console.log("click-parent--事件捕获");
},true);
document.getElementById('child').addEventListener("click",function(e){
console.log("click-child---事件冒泡");
},false);
事件代理
我们知道事件会在当前元素与根元素之间传递,所以说,在一个元素上产生的事件会向上传递给它的父元素,而不会向下传递给它的子元素.
利用事件流的特性,我们可以实现用在父级元素上绑定事件,再通过子元素去触发,省去了给众多子元素绑定事件的开销.
parent.onclick = function(e){
if(e.target.id == "child") console.log("点击了child元素")
}
JavaScript 事件处理机制的更多相关文章
- 私人定制javascript事件处理机制(浅谈)
看到园子里关于事件监听发表的文章,我都有点不好意思写了.不过想想我的题目以私人定制作开头也就妥妥地写吧. 事件相关概念 1.事件类型 发生事件的字符串 有传统事件类型 比如表单.window事件等 D ...
- 【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)
前言 这篇博客有点长,如果你是高手请您读一读,能对其中的一些误点提出来,以免我误人子弟,并且帮助我提高 如果你是javascript菜鸟,建议您好好读一读,真的理解下来会有不一样的收获 在下才疏学浅, ...
- Javascript事件机制兼容性解决方案
本文的解决方案可以用于Javascript native对象和宿主对象(dom元素),通过以下的方式来绑定和触发事件: 或者 var input = document.getElementsByTag ...
- 【探讨】javascript事件机制底层实现原理
前言 又到了扯淡时间了,我最近在思考javascript事件机制底层的实现,但是暂时没有勇气去看chrome源码,所以今天我来猜测一把 我们今天来猜一猜,探讨探讨,javascript底层事件机制是如 ...
- 阅读《深入理解JavaScript定时机制》
鸟哥的这篇<深入理解JavaScript定时机制>从javascript线程角度分析了setTimeout和setInterval两个定时触发器的实现原理. 看完的体验就是主要要记住两点: ...
- 使用AmplifyJS和JQuery编写更好更优雅的javascript事件处理代码
事件(或消息)是一种经常使用的软件设计模式.可以减少消息处理者和消息公布者的之间的耦合,比方J2EE里面的JMS规范.设计模式中的观察者模式(也叫公布/订阅模式).这对于javascript代码相同适 ...
- JavaScript 内存机制
简介 每种编程语言都有它的内存管理机制,比如简单的C有低级的内存管理基元,像malloc(),free().同样我们在学习JavaScript的时候,很有必要了解JavaScript的内存管理机制. ...
- 【THE LAST TIME】彻底吃透 JavaScript 执行机制
前言 The last time, I have learned [THE LAST TIME]一直是我想写的一个系列,旨在厚积薄发,重温前端. 也是给自己的查缺补漏和技术分享. 欢迎大家多多评论指点 ...
- 深入理解JavaScript运行机制
深入理解JavaScript运行机制 前言 本文是写作在给团队新人培训之际,所以其实本文的受众是对JavaScript的运行机制不了解或了解起来有困难的小伙伴.也就是说,其实真正的原理和本文阐述的并不 ...
随机推荐
- 【xsy1281】 珠串 打表+乱搞or数位dp
题目大意:你要找出一个有$k$个的本质不同的$n$位二进制数的集合,使得集合中最大的数最小,请输出这个数 本质不同定义:对于一个数$k$,$rev(k)$,$~k$,$rev(~k)$与$k$本质相同 ...
- Numpy.random中shuffle与permutation的区别(转)
huffle与permutation的区别 函数shuffle与permutation都是对原来的数组进行重新洗牌(即随机打乱原来的元素顺序):区别在于shuffle直接在原来的数组上进行操作,改变原 ...
- (转)centos 7 Tomcat 8.5 的安装及生产环境的搭建调优
原文:https://www.cnblogs.com/linhankbl/articles/9149804.html#top JVM菜鸟进阶高手之路七(tomcat调优以及tomcat7.8性能对比) ...
- RVM的安装和使用过程中碰到的问题
Ruby Version Manager简称RVM,是一款非常好用的ruby版本管理以及安装工具. 关于rvm的安装,可以参考以下文章: use rvm install and manage ruby ...
- jquery.cropper 裁剪图片上传
https://github.com/fengyuanchen/cropper 1.必要的文件引用: <script src="/path/to/jquery.js"> ...
- unittest单元测试框架简单说明
unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...
- php获取全选checkbox多个值
<form name="myform" action="index2.php" method="post"> ...
- 数据库设计 Step by Step (2)——数据库生命周期
引言:数据库设计 Step by Step (1)得到这么多朋友的关注着实出乎了我的意外.这也坚定了我把这一系列的博文写好的决心.近来工作上的事务比较繁重,加之我期望这个系列的文章能尽可能的系统.完整 ...
- C#控件事件属性大全
C#控件及常用设计整 1.窗体... 1 2.Label 控件... 3 3.TextBox 控件... 4 4.RichTextBox控件... 5 5.NumericUpDown 控件... 7 ...
- [java初探06]__排序算法的简单认识
今天,准备填完昨天没填的坑,将排序算法方面的知识系统的学习一下,但是在简单的了解了一下后,有些不知如何组织学习了,因为排序算法的种类,实在是太多了,各有优略,各有适用的场景.有些不知所措,从何开始. ...