前言
直接操作DOM已经很少在业务场景中用到了,但DOM始终作为前端的基础之一,在面试中往往总能够遇到。本文希望能够汇总以下简单的DOM知识点,让自己在沉迷框架构建时,不至于忽略或者忘记最基础的知识。主要分为两部分:1、常用的DOM方法的汇总;2、DOM的事件机制,主要是事件冒泡与事件捕获。
DOM方法
选取元素
名称选择
名称选择比较简单,主要是根据ID、name属性、标签名称、类名;来选择对应的DOM节点。
1 | //ID选择器:基于id="" |
CSS选择
通过CSS样式表选择器的强大语法,也可以来选择元素,返回第一个匹配的元素,或者返回元素数组。
1 | var title = document.querySelector("#title"); // CSS ID选择 |
相近节点选取
节点:页面中所有的内容都是节点(标签,属性,文本:文字,空格,换行)文档:document—-页面中的顶级对象元素:页面中所有的标签,标签–元素–对象(通过DOM的方式来获取这个标签,得到了这个对象,此时这个对象叫DOM对象)。
关于节点的选取有如下的方法:
1 | h1.parentNode;//父节点 |
元素相关的选取同样有如下的方法:
1 | h2.children;//以数组的形式返回所有的子元素 |
属性相关
表示HTML文档元素的HTMLElement对象定义了读/写属性,它们对应于元素的HTML属性。 HTMLElement定义的通用HTML属性,包括id、lang、dir、事件处理程序onclick及表单相关属性等。
1 | h3.getAttribute("width");//返回非标准的HTML属性的值 |
创建节点
1 | document.createElement("h1");//使用document 对象的createElement () 方法创建新的Element节点 |
插入、修改节点
1 | h5.appendChild("h1");//在指定元素上插入子节点,并使其成为该节点的最后一个子节点 |
DOM事件机制
1、事件是在编程时系统内发生的动作或者发生的事情
2、事件是要绑定在元素上的。比如给一个div元素绑定一个鼠标悬浮事件,给一个ol元素绑定鼠标单击事件。
3、可以使用事件监听函数(也叫事件处理程序、侦听器)来监听事件,以便事件发生时执行相应的代码
事件发生时元素节点之间按照特定的顺序传播,这个过程即DOM事件流,描述的是从页面接收事件的顺序。
冒泡与捕获
首先开始事件捕获阶段:从DOM树最根部的节点window
开始,沿着DOM树向下遍历每个元素,直到触发元素目标元素target。如果这些元素也注册了click事件(且为捕获阶段),就会执行他们相应的事件监听函数。即从上到下触发父元素对应的事件。在事件捕获这一阶段,为截获事件提供了机会。
当前目标阶段:实际的目标接收到,并执行对应得事件监听函数。
事件冒泡阶段:从触发元素目标元素target开始,向上逆着遍历DOM树,直到最根部window
元素。如果这些元素也注册了click事件(且为冒泡阶段),就会执行他们相应的事件监听函数
我们在使用 addEventListener 监听事件时,addEventListener(‘click’, fn, bool)如果第三个参数 bool 不传,或者传 false, 那么我们会在冒泡阶段调用 fn如果第三个参数 Bool 传值为 true, 那么我们会在捕获阶段调用 fn。因此,默认是在冒泡阶段来监听事件的。
捕获不可以取消,但是冒泡可以取消,e.propagation()就可但是有一些事件不可以取消冒泡,比如 scroll 事件。
1 | <div> |
事件委托
冒泡阶段,浏览器从用户点击的内容从下往上遍历至 window,逐个触发事件处理函数,因此可以监听一个祖先节点(例如爸爸节点、爷爷节点)来同时处理多个子节点的事件。
主要的作用有:1、省掉监听数,节省内存;要监听多个兄弟元素时,不如只监听父元素,并在事件处理函数中,利用e.target来判断到底是哪一个子元素触发了事件,再进行对应的处理即可。
2、监听不存在的元素,即动态元素。