最后更新于:2022-04-01 23:53:43
元素里面的所有元素。 ``` var p = document.getElementsByTagName('p')[0]; var span = p.getElementsByTagName('span'); ``` **1.2.4 用指定CSS类选取元素** HTML元素的`class`属性值是一个以空格隔开的列表,可以为空或包含多个标识符。 在HTML文档和HTML元素上,我们可以调用`getElementsByClassName()`来选择指定CSS类的元素,它返回一个实时的NodeList对象,包含文档或元素所有匹配的后代节点。 `getElementsByClassName()`只需要一个字符串参数,但是该字符串可以由多个空格隔开的标识符组成,只有当元素的class属性值包含所有指定的标识符时才匹配。 在`Element`类中也同样定义了`getElementsByClassName()`方法,其原理和Document版本是一样的,不过它只选取调用该方法的元素的后代元素。 **1.2.5 通过CSS选择器选取元素** `Document`对象的方法`querySelectorAll()`,它接受一个CSS选择器的字符串参数,返回一个代表文档中匹配选择器的所有元素的NodeList对象,并不是实时的。如果没有匹配的元素,则返回一个空的NodeList对象。 ``` document.querySelectorAll('.div') //匹配所有class名为div的元素 ``` 还有一个`querySelector()`方法,其原理和`querySelectorAll()`是一样的,不过它返回第一个匹配的元素(以文档顺序),如果没有匹配的元素就返回null。 它们支持复杂的CSS选择器。 ``` // 选中data-tip属性等于title的元素 document.querySelectorAll('[data-tip="title"]'); // 选中div元素,那些class含ignore的除外 document.querySelectorAll('div:not(.ignore)'); ``` 但是,它们不支持CSS伪元素的选择器(比如:first-line和:first-letter)和伪类的选择器(比如:link和:visited),即无法选中伪元素和伪类。 这两个方法在`Element`节点上也有定义。 **1.2.6 document.all[ ]** document.all[ ]也可用来选择元素,不过已经废弃了。 ``` document.all[0] //文档中第一个元素 document.all['navbar'] // id或name为“navbar”的元素 ``` **1.3 文档结构和遍历** **1.3.3 作为节点树的文档** `Document`对象、它的`Element对象`和文档中表示文本的Text对象都是Node对象。 Node属性: **(1)parentNode** 该节点的父节点,或者针对类似Document对象应该是null,因为它没有父节点。 **(2)childNodes** 返回只读的类数组对象(NodeList对象),它是该节点的子节点的实时表。 注意:该属性还包括文本节点和评论节点。 **(3)firstChild、lastChild** 该节点的子节点中的第一个和最后一个,如果该节点没有子节点则为null 注意:这两个属性返回的除了HTML元素子节点,还可能是文本节点或评论节点。 **(4)nextSibling、previousSibling** 该节点的兄弟节点中的前一个和下一个。具有相同父节点的两个节点称为兄弟节点。节点的顺序反映了它们在文档中出现的顺序。这两个属性将节点之间以双向链表形式连接起来。 注意:这两个属性返回的除了HTML元素子节点,还可能是文本节点或评论节点。 **(5)textContent** 返回该节点和它的所有后代节点的文本内容。 ``` 我是textContent document.getElementById('div').textContent // 我是textContent ``` **(6)nodeType** 该节点的类型。 9:Document节点 1:Element节点 3:Text节点 8:Comment节点 11:DocumentFragment节点 **(7)nodeValue** Text节点或者Comment节点的文本内容。只有Text节点和Comment节点的nodeValue可以返回结果,其他类型的节点一律返回null。 **(8)nodeName** 元素的标签名,以大写形式表示。 **nodeType和nodeName** ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/dc61fd75984e2ff6ddc9f7146ff35719_532x306.png) 使用这些node属性,我们可以便捷的得到各个节点的引用 ``` document.childNodes[0].childNodes[1] //等价于 document.firstChild.firstChild.nextSibling ``` **1.3.4 作为元素树的文档** 当我们的关注点在文档的元素上而非它们之间的文本上时,JavaScript提供了另外一个API,它将文档看做是E乐门头对象树,忽略部分文档:Text和Comment节点。 **属性** **(1)children** 类似childNodes,返回一个NodeList对象,但children列表只包含Element对象。 **注意**:Text和Comment节点没有children属性,意味着node.parentNode属性不可能返回Text或Comment节点。任何Element的parentNode总是另一个Element,或者,追溯到树根的Document或DocumentFragment节点。 **(2)firstElementChild、lastElementChild** 类似firstChild和lastChild,但只代表`子Element`。 **(3)nextElementSibling、previousElementSibling** 类似nextSibling和previousSibling,但只代表`兄弟Element`。 **(4)childElementCount** 子元素的数量。返回的值和`children.length`值相等。 **(5)offsetParent** offsetParent属性返回当前HTML元素的最靠近的、并且CSS的position属性不等于static的父元素。如果某个元素的所有上层节点都将position属性设为static,则Element.offsetParent属性指向``元素。 **1.4NodeList对象和HTMLCollection对象** **1.4.1 NodeList对象** NodeList实例对象是一个`类数组对象`,它的成员是节点对象。比如node.childNodes、document.querySelectorAll()返回的都是NodeList实例对象。 ``` document.childNodes instanceof NodeList //true ``` NodeList实例对象可能是动态集合,也可能是静态集合。所谓动态集合就是一个活的集合,DOM树删除或新增一个相关节点,都会立刻反映在NodeList接口之中。Node.childNodes返回的,就是一个动态集合。 NodeList接口实例对象提供length属性和数字索引,因此可以像数组那样,使用数字索引取出每个节点,但是它本身并不是数组,不能使用pop或push之类数组特有的方法。 **1.4.2 HTMLCollection对象** HTMLCollection实例对象与NodeList实例对象类似,也是节点的集合,返回类数组对象。 在HTMLDocument类中,有一些快捷属性来访问各种各样的节点。比如:images、forms和links等属性指向类数组的``、``和``(只包含那些有href属性的``标签)元素集合。这些属性都是返回HTMLCollection实例对象。 HTMLDocument也定义了embeds和plugins属性,它们是同义词,都是HTMLCollection类型的``元素的集合。anchors是非标准属性,它指代有一个name属性的``元素。 在HTML5中,加入了scripts,它是HTMLCollection类型的 ';