摘要:队列的实质是数组。事件在默认执行的过程中是先捕获后冒泡,第三个参数只是让它在什么状态下触发。用方法,绑定的其他事件也将不会执行。
DOM 0 知识点
//是对的 //是对的
HTML 中onclick = "要执行的代码",一旦用户点击,浏览就eval("要执行的代码"),这里不是属性,不是函数,是一段代码。
JavaScript 中,一旦用户点击,浏览器就执行X.onclick.call(X,{}),意思是onclick是一个函数属性,而print是一个属性,因为它的类型是对象;但下面的print()的类型是undefined。
所以在HTML 中必须传递一个要执行的代码,JavaScript 中必须传递一个函数
那它们两个的区别是啥呢?
xxx.onclick = function(){}只是一个属性,所以它是唯一的,如果这时候你要绑定2个onclick事件就麻烦了。
xxx.addEventListener()它是一个队列,先进先出,就是说先绑定的先触发。所以它叫做事件监听队列,这里是排队,xxx拥有一个队列叫做eventlisteners,你不能直接访问它,但你可以通过addEventListener去排个队,如果用户点击了,就先触发排在第一位的函数,排在后面的一次触发。队列的实质是数组。既然有入队,那是不是也有出队:
function f1(){ console.log(1); } function f2(){ console.log(2); } function f1(){ console.log(3); } xxx.addEventListener("click",f1); xxx.addEventListener("click",f2); xxx.removeEventListener("click",f1); xxx.addEventListener("click",f3); xxx.removeEventListener("click",f3);
最后的结果就是打印:2。
f1 在排队的过程中移除了,f3 刚进入队列就移除了。
前面写轮播的时候用了one事件,它内部是怎样的呢?
function f1(){ console.log(1); xxx.removeEventListener("click",f1); } xxx.addEventListener("click",f1);
one在函数处理时的最后一句加上离开队列语句,on就是没有出队这句的,也就是说一直会执行。
JS事件中的冒泡和捕获捕获事件:事件从最外层父元素到最里层子元素的顺序触发,叫做捕获事件,果document > html > body > div > p > button
冒泡事件:正好和捕获事件相反,事件从最里层子元素到最外层父元素的顺序触发,叫做冒泡事件,如:button > p > div > body > html > document
DOM 2 中规定了同时支持捕获事件和冒泡事件,用addEventListener()方法绑定一个事件处理函数,其语法:
target.addEventListener(type, listener, useCapture);
type:表示监听事件类型的字符串,如clcik,前面没有on
listener:表示监听的对象或者一个函数
useCapture:表示是否使用捕获,接受一个布尔值,true是触发捕获事件,不写默认false触发用冒泡事件。
事件在默认执行的过程中是先捕获后冒泡,第三个参数只是让它在什么状态下触发。如果一个节点捕获和冒泡事件同时存在,谁在前谁先执行,和事件无关。
s1s2
当我点击在s2上面,触发顺序是s1捕获事件 > s2冒泡事件 > s2捕获事件 > s1冒泡事件
事件代理:事件会在冒泡阶段向上传播到父节点,因此可以把子节点的监听函数定义在父节点上,由父节点的监听函数统一处理多个子元素的事件。这种方法叫做事件的代理(delegation)。
来看一个具体例子:获取li里面的文本,用事件流方法
var ul = document.querySelector("ul"); ul.addEventListener("click",showColor,false); function showColor(e){ var x = e.target; if(x.nodeName.toLowerCase() === "li"){ console.log("The color is " + x.innerHTML); } }
如果不使用事件代理,要获取li里面的文本应该怎么弄呢?老方法是获取到所有子元素li,遍历它就可以了
var colors = color-list.children for(var i=0;i阻止事件不再传播,可以使用事件对象的stopPropagation()方法,但不会彻底消除事件,如果说绑定多个事件的话。
用stopImmediatePropagation()方法,绑定的其他事件也将不会执行。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/95179.html
摘要:处于目标阶段事件在上发生并处理。冒泡阶段事件又传播回文档。不支持捕获事件的。总结二使用事件委托新添加的元素还会有之前的事件。事件对象在触发某个事件时,会产生一个事件对象。 js 是采用异步事件驱动的机制来响应用户操作的,也就是说当用户对某个html元素进行操作的时候,会产生一个事件,该事件会驱动某些函数来处理。事件源:产生事件的地方(html元素,窗口,其他等等);事件:鼠标事件,键盘...
摘要:而由于级标准中并没有定义事件相关的内容,所以事件级别只包括级,级和级三种。此属性返回当前事件所绑定的对象。自定义事件可以绑定到任意元素上,此处选择只是为了演示方便。 前端学习的东西有很多,现代前端开发,前端工程化的东西要懂,基础的原生js也要懂,毕竟,框架都是有生命周期的,更替非常快,然而却有这么一个框架,它是最轻量的前端框架,每个浏览器都内置,它叫vanilla.js。好吧,其实va...
摘要:响应某个事件的函数就叫事件处理程序或事件侦听器。为事件指定事件处理程序的方法主要有种。事件处理程序事件直接加在元素上。事件委托利用冒泡的原理,把事件加到父元素或祖先元素上,触发执行效果,解决事件处理程序过多问题。事件委托优点提高性能。 JavaScript简单入门可以看看我丑丑的Github博客JavaScript简单入门 事件 JavaScript与HTML之间的交互是通过事件实现的...
阅读 2742·2021-11-19 09:40
阅读 5288·2021-09-27 14:10
阅读 2095·2021-09-04 16:45
阅读 1455·2021-07-25 21:37
阅读 2991·2019-08-30 10:57
阅读 2978·2019-08-28 17:59
阅读 1051·2019-08-26 13:46
阅读 1402·2019-08-26 13:27