DOM 编程中经常需要确定一个元素是不是另一个元素的后代。IE 首先引入了contains()方法,
让开发者可以在不遍历DOM 的情况下获取这个信息。contains()方法应该在要搜索的祖先元素上调
用,参数是待确定的目标节点。
如果目标节点是被搜索节点的后代,contains()返回true,否则返回false。下面看一个例子:
console.log(document.documentElement.contains(document.body)); // true
这个例子测试元素中是否包含元素,在格式正确的HTML 中会返回true。
另外,使用DOM Level 3 的compareDocumentPosition()方法也可以确定节点间的关系。这个
方法会返回表示两个节点关系的位掩码。下表给出了这些位掩码的说明。
掩 码 节点关系
0x1 断开(传入的节点不在文档中)
0x2 领先(传入的节点在DOM 树中位于参考节点之前)
0x4 随后(传入的节点在DOM 树中位于参考节点之后)
0x8 包含(传入的节点是参考节点的祖先)
0x10 被包含(传入的节点是参考节点的后代)
要模仿contains()方法,就需要用到掩码16(0x10)。compareDocumentPosition()方法的结
果可以通过按位与来确定参考节点是否包含传入的节点,比如:
let result = document.documentElement.compareDocumentPosition(document.body);
console.log(!!(result & 0x10));
以上代码执行后result 的值为20(或0x14,其中0x4 表示“随后”,加上0x10“被包含”)。对
result 和0x10 应用按位与会返回非零值,而两个叹号将这个值转换成对应的布尔值。
IE9 及之后的版本,以及所有现代浏览器都支持contains()和compareDocumentPosition()
方法。
插入标记
HTML5 将IE 发明的innerHTML 和outerHTML 纳入了标准,但还有两个属性没有入选。这两个剩
下的属性是innerText 和outerText。
- innerText 属性
innerText 属性对应元素中包含的所有文本内容,无论文本在子树中哪个层级。在用于读取值时,
innerText 会按照深度优先的顺序将子树中所有文本节点的值拼接起来。在用于写入值时,innerText
会移除元素的所有后代并插入一个包含该值的文本节点。来看下面的HTML 代码:
This is a paragraph with a list following it.
- Item 1
- Item 2
- Item 3