22.Dom、事件

22.Dom、事件,第1张

打印结果:

elem.children和elem.childNodes都是返回元素 直接子元素

区别在于:

elem.children 返回的是所有标签的元素节点的集合;

elem.childNodes 包括当前节点的所帆羡有子节点的集合。除了HTML元素节点,该属性返回的态肆拍还包括Text节点和Comment节点。其中文本节点包括:空格、换行符和制表符等。

常见的方法:

getElementById()、getElementsByClassName()、getElementsByTagName()、getElementsByName()、querySelector()、querySelectorAll()

①getElementById()返回匹配指定ID属性的元素节点。如果没有发现匹配的节点,则返回null。注意:如果有几个相同id名,只返回第一个。

②getElementsByClassName()方法返回一个类似数组的对象(HTMLCollection类型的对象),包括了所有class名字符合指定条件的元素,元素的变化实时反映在返回结果中。

这个方法不仅可以在document对象上调用,也可以在任何元素节点上调用。

注意:这个方法的参数可以是多个空格分隔的class名字,返回同时具有这些节点的元素。

③getElementsByTagName()方法返回所有指定标签的元素。返回值是一个HTMLCollection对象(类似数组),任何元素的变化会实时反映在返回结果中。

这个方法不仅可以在document对象上调用,也可以在任何元素节点上调用。

④getElementsByName方法用于选择拥有name属性的HTML元素,比如form、img、frame、embed和object,返回一个NodeList格式的对象,不会实时反映元素的变化。

⑤querySelector方法返回匹配指定的CSS选择器的元素节点。如果有多个节点满足匹配条件,则返回第一个匹配的节点。如果没有发现匹配的节点,则返回null。

⑥querySelectorAll方法返回匹配指定的CSS选择器的所有节点,返回的是NodeList类型的对象。NodeList对象不是动态集合,所以元素节点的变化无法实时反映在返回结果中。

①创建一个元素可以用createElement()方法:

②给元素设置属性可以用setAttribute()方法:

③createTextNode()方法用雹胡来生成文本节点,参数为所要生成的文本节点的内容。

添加元素的方法有:

①appendChild()是在调用该方法的元素内添加新元素。新元素是作为子元素被添加的,且是添加在元素内最后的位置。

②insertBefore()也是在调用该方法的元素内添加新元素。但该方法接收两个参数,一个是被添加的元素,另一个是被“替位”的子元素。新元素会插入在旧子元素的位置之前。

删除元素方法有:

removeChild()能删除指定的元素

替换元素方法有:

replaceChild()接受两个参数:要插入的元素和要替换的元素

举例说明:

DOM0级事件就是将一个函数赋值给一个事件处理程序属性。

②它的一个事件处理程序只能对应一个事件处理程序,也就是如果对同一事件,后面的处理程序会覆盖前面的.。

①** DOM2级事件处理方式指定了添加事件处理程序和删除事件处理程序的方法,addEventListener和removeEventListener**。

②它的一个事件可以添加多个事件处理程序(可以写多个函数),而不会被后面的所覆盖,同时也不会覆盖DOM0级事件。

③它可以选择在捕获阶段还是冒泡阶段处理程序。

④IE9之前不支持DOM2级事件,而DOM0则跨浏览器且无兼容问题;

前言

一、DOM事件级别

DOM级别一共可以分为四个级别:DOM0级、DOM1级、DOM2级和DOM3级。而DOM事件分为3个级别:DOM 0级事件处理,DOM 2级事件处理和DOM 3级事件处理。由于DOM 1级中没有事件的相关内容,所以没有DOM 1级事件。

1.DOM 0级事件

el.onclick=function(){}

当希望为同一个元素/标签绑定多个同类型事件的时候(如给上面的这个btn元素绑定3个点击事件),是不被允许的。DOM0事件绑定,给元素的腊帆事件行为绑定方法,这些方法都是在当前元素事件行为的冒泡阶段(或者目标阶段)执行的。

2.DOM 2级事件

el.addEventListener(event-name, callback, useCapture)

event-name: 事件名称,可以是标准的DOM事件

callback: 回调函数,当事件触发时,函数会被注入一个参数为当前的事件对象 event

useCapture: 默认是false,代表事件句柄在冒泡阶段执行

IE9以下的IE浏览器不支持 addEventListener()和removeEventListener(),使用 attachEvent()与detachEvent() 代替,因为IE9以下是不支持事件捕获的,所以也没有第三个参数,第一个事件名称前要加on。

3.DOM 3级事件

在DOM 2级事件的基础上添加了更多的事件类型。

UI事件,当用户与页面上的元素交互时触发,如:load、scroll

焦点事件,当元素获得或失去焦点时触发,如:blur、focus

鼠标事件,当用户通过鼠标在页面执行 *** 作时触发如:dblclick、mouseup

滚轮事件,当使用鼠标滚轮或类似设备时触发,如:mousewheel

文本事件,当在文档中输入文本时触发,如:textInput

键盘事件,当用户通过键盘在页面上执行 *** 作时触发,如:keydown、轮圆雹keypress

合成事件,当为IME(输入法编辑器)输入字符时触发,如:compositionstart

变动事件,当底层DOM结构发生变化时触发,如:DOMsubtreeModified

同时DOM3级事件也允许使用者自定义一些事件。

二、DOM事件模型和事件流

DOM事件模型分为捕获和冒泡。一个事件发生后,会在子元素和父元素之间传播(propagation)。这种传播分成三个阶段。

(1)捕获阶段:事件从window对象自上而下向目标节点传播的阶段;

(2)目标阶段:真正的目标节点正在处理事件的阶段;

(3)冒泡阶段:事件从目标节点自下而上向window对象传播的阶段。

DOM事件捕获的具体流程

捕腔虚获是从上到下,事件先从window对象,然后再到document(对象),然后是html标签(通过document.documentElement获取html标签),然后是body标签(通过document.body获取body标签),然后按照普通的html结构一层一层往下传,最后到达目标元素。

而事件冒泡的流程刚好是事件捕获的逆过程。

接下来我们看个事件冒泡的例子:

正如我们上面提到的onclick给元素的事件行为绑定方法都是在当前元素事件行为的冒泡阶段(或者目标阶段)执行的。

三、事件代理(事件委托)

由于事件会在冒泡阶段向上传播到父节点,因此可以把子节点的监听函数定义在父节点上,由父节点的监听函数统一处理多个子元素的事件。这种方法叫做事件的代理(delegation)。

1.优点

减少内存消耗,提高性能

假设有一个列表,列表之中有大量的列表项,我们需要在点击每个列表项的时候响应一个事件

如果给每个列表项一一都绑定一个函数,那对于内存消耗是非常大的,效率上需要消耗很多性能。借助事件代理,我们只需要给父容器ul绑定方法即可,这样不管点击的是哪一个后代元素,都会根据冒泡传播的传递机制,把容器的click行为触发,然后把对应的方法执行,根据事件源,我们可以知道点击的是谁,从而完成不同的事。

动态绑定事件

在很多时候,我们需要通过用户 *** 作动态的增删列表项元素,如果一开始给每个子元素绑定事件,那么在列表发生变化时,就需要重新给新增的元素绑定事件,给即将删去的元素解绑事件,如果用事件代理就会省去很多这样麻烦。

2.如何实现

接下来我们来实现上例中父层元素 #list 下的 li 元素的事件委托到它的父层元素上:

四、Event对象常见的应用

event. preventDefault()

如果调用这个方法,默认事件行为将不再触发。什么是默认事件呢?例如表单一点击提交按钮(submit)跳转页面、a标签默认页面跳转或是锚点定位等。

很多时候我们使用a标签仅仅是想当做一个普通的按钮,点击实现一个功能,不想页面跳转,也不想锚点定位。

也可以通过JS方法来阻止,给其click事件绑定方法,当我们点击A标签的时候,先触发click事件,其次才会执行自己的默认行为

接下来我们看个例子:输入框最多只能输入六个字符,如何实现?

event.stopPropagation() &event.stopImmediatePropagation()

event.stopPropagation() 方法阻止事件冒泡到父元素,阻止任何父事件处理程序被执行。上面提到事件冒泡阶段是指事件从目标节点自下而上向window对象传播的阶段。

我们在例4的inner元素click事件上,添加event.stopPropagation()这句话后,就阻止了父事件的执行,最后只打印了'inner'。

stopImmediatePropagation 既能阻止事件向父元素冒泡,也能阻止元素同事件类型的其它监听器被触发。而 stopPropagation 只能实现前者的效果。我们来看个例子:

如上所示,使用 stopImmediatePropagation后,点击按钮时,不仅body绑定事件不会触发,与此同时按钮的另一个点击事件也不触发。

event.target &event.currentTarget

老实说这两者的区别,并不好用文字描述,我们先来看个例子:

当我们点击最里层的元素d的时候,会依次输出:

从输出中我们可以看到,event.target指向引起触发事件的元素,而event.currentTarget则是事件绑定的元素,只有被点击的那个目标元素的event.target才会等于event.currentTarget。也就是说,event.currentTarget始终是监听事件者,而event.target是事件的真正发出者。

五、参考文章

DOM级别与DOM事件

DOM事件机制解惑

事件模型

JavaScript 事件委托详解

JavaScript 事件的学与记:stopPropagation 和 stopImmediatePropagation

event.target和event.currentTarget的区别

原文: https://github.com/ljianshu/Blog/issues/44

最后:“相信有很多想学前端的小伙伴,今年年初我花了一个月整理了一份最适合2018年学习的web前端干货,从最基础的HTML+CSS+JS到移动端HTML5等都有整理,送给每一位前端小伙伴,53763,1707这里是小白聚集地,欢迎初学和进阶中的小伙伴。”

祝大家早日学有所成,拿到满意offer,快速升职加薪,走上人生巅峰。

捕获阶段是先从父元素开始一级级向上查询子元素的

冒泡阶段谨冲带就是事件从最顶层的子节点一步步冒祥芦泡到各级父元素阶段

addEventListener("eventName", doSomething, false) , 第三个Boolean参数为 true 时, 表示事件处理程序注册在时间捕判绝获阶段, 为 false 时, 注册在冒泡阶段.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12297948.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存