前端精髓Web前端之路让前端飞

DOM节点分析

2017-08-23  本文已影响14人  前端精髓

文档中所有的节点之间都存在这样或那样的关系。节点间的各种关系可以用传统的家族关系来描述,相当于把文档树比喻成家谱。在HTML中,可以将 元素看成是 元素的子元素;相应地,也就可以将 元素看成是 元素的父元素。而 元素,则可以看成是 元素的同胞元素,因为它们都是同一个父元素 的直接子元素。

每个节点都有一个 childNodes 属性,其中保存着一个 NodeList 对象。 NodeList 是一种类数组对象,用于保存一组有序的节点,可以通过位置来访问这些节点。请注意,虽然可以通过方括号语法来访问 NodeList 的值,而且这个对象也有 length 属性,但它并不是 Array 的实例。 NodeList 对象的独特之处在于,它实际上是基DOM结构动态执行查询的结果,因此DOM结构的变化能够自动反映在 NodeList 对象中。我们常说, NodeList 是有生命、有呼吸的对象,而不是在我们第一次访问它们的某个瞬间拍摄下来的一张快照。

下面的例子展示了如何访问保存在 NodeList 中的节点——可以通过方括号,也可以使用 item() 方法。

var firstChild = someNode.childNodes[0];
var secondChild = someNode.childNodes.item(1);
var count = someNode.childNodes.length;

无论使用方括号还是使用 item() 方法都没有问题,但使用方括号语法看起来与访问数组相似,因此颇受一些开发人员的青睐。另外,要注意 length 属性表示的是访问NodeList 的那一刻,其中包含的节点数量。对 arguments 对象使用 Array.prototype.slice() 方法可以将其转换为数组。而采用同样的方法,也可以将 NodeList 对象转换为数组。来看下面的例子:

//在IE8及之前版本中无效
var arrayOfNodes = Array.prototype.slice.call(someNode.childNodes,0);

除IE8及更早版本之外,这行代码能在任何浏览器中运行。由于IE8及更早版本将 NodeList 实现为一个COM对象,而我们不能像使用JScript对象那样使用这种对象,因此上面的代码会导致错误。要想在IE中将 NodeList 转换为数组,必须手动枚举所有成员。下列代码在所有浏览器中都可以运行:

function convertToArray(nodes){
    var array = null;
    try {
        array = Array.prototype.slice.call(nodes, 0); //针对非IE浏览器
    } catch (ex) {
        array = new Array();
        for (var i=0, len=nodes.length; i < len; i++){
            array.push(nodes[i]);
        }
    }
    return array;
}

这个 convertToArray() 函数首先尝试了创建数组的最简单方式。如果导致了错误(说明是在IE8及更早版本中),则通过 try-catch 块来捕获错误,然后手动创建数组。这是另一种检测怪癖的形式。

相关链接DOM节点分析Web前端精髓

上一篇下一篇

猜你喜欢

热点阅读