最近写代码时需要获取符合某些条件的节点子元素,用firstChild之类的方法会包含文本节点,所以包装了一个简单的类:

     //子元素遍历器
function ElementWalker(node) {
if(typeof node === 'string')
node = document.getElementById(node);
this.node = node;
}
ElementWalker.prototype = {
//获取第一个指定tagName的子元素,如果tagName没定义,则返回第一个子元素
first: function(tagName) {
if((typeof tagName === 'undefined') && this.node.firstElementChild) {
return new ElementWalker(this.node.firstElementChild);
}
for(i = 0; i < this.node.childNodes.length; i++) {
if(this.checkChild(i,tagName)) {
return new ElementWalker(child);
}
}
},
//获取最后一个指定tagName的子元素,如果tagName没定义,则返回最后一个子元素
last: function(tagName) {
if((typeof tagName === 'undefined') && this.node.lastElementChild) {
return new ElementWalker(this.node.lastElementChild);
}
for(i = parent.childNodes.length - 1; i >= 0; i--) {
var child = this.node.childNodes[i];
if(this.checkChild(child,tagName)) {
return new ElementWalker(child);
}
}
},
//返回所有指定tagName的子元素,如果tagName没定义,则返回所有子元素
all: function(tagName) {
var children = [];
for(i = 0; i < this.node.childNodes.length; i++) {
var child = this.node.childNodes[i];
if(this.checkChild(child,tagName)) {
children.push(new ElementWalker(child));
}
}
return children;
},
//校验child是否是指定tagName的元素
checkChild : function(child,tagName) {
var isOK = (typeof tagName === 'undefined') && child.nodeType == 1;
isOK = isOK || (child.tagName && child.tagName.toLowerCase() === tagName);
return isOK;
}
}
05-02 06:36