我正在尝试执行递归函数来按类查找HTMLelement,但由于某种原因它在到达没有子元素的子元素后停止。这是代码:
var alpha = Obj.elementByClass(document.body, "message");
Obj.elementByClass = function(element, cl) {
var elementChildren = element.children,
elementChildrenLength = elementChildren.length;
for(var num=0; num<elementChildrenLength; num++) {
if(elementChildren[num].className && elementChildren[num].className.indexOf("cl") > -1) {
return elementChildren[num];
}
else if(elementChildren[num].children.length !=0) {
return Obj.elementByClass(elementChildren[num], cl);
}
}
};
请不要建议jquery或其他库,我想了解为什么它到达没有孩子的元素时会停止。
谢谢!
答案 0 :(得分:1)
因为for
循环在元素没有子元素时永远不会执行,因为num
和elementChildrenLength
都是0
且条件num<elementChildrenLength
永远不会是真的。
答案 1 :(得分:1)
非元素节点(例如文本节点)没有childNodes属性,因此尝试在其上读取.children.length
会抛出错误,从而中止执行。
您必须验证节点是否为元素:
for(var num=0; num<elementChildrenLength; num++) {
if (elementChildren[num].nodeType !== 1) {
continue;
}
...
或者在访问节点之前检查该节点是否具有childNodes属性:
else if(elementChildren[num].children && elementChildren[num].children.length !=0) {
答案 2 :(得分:1)
如果elementChildrenLength
等于零,那么整个for循环块将不会执行。
避免这种情况的最好方法是使用以下内容包装for循环块:
if(elementChildrenLength==0){
return 0;
}else{
for(var num=0; num<elementChildrenLength; num++) {
//for loop block here
}
}
答案 3 :(得分:1)
Obj.elementByClass = function(element, cl) {
for(var i=0, len = element.children.length; i<len; i++) {
if (element.children[i].className && new RegExp('\\b'+cl+'\\b').test(element.children[i].className))
return element.children[i];
else if(element.children[i].children.length)
return Obj.elementByClass(element.children[i], cl);
}
};
有几点:
indexOf()
明确查找字符串“cl”,我认为您的意思是cl
答案 4 :(得分:1)
据我所知,您正在使用className'message'搜索body元素的第一个子元素。我可以建议这个替代方案吗?
document.querySelector('body .message')
该函数返回undefined
,因为第一个条件AND else if(elementChildren[num].children.length !=0)
都不为真。所以,无事可做,退出,没有任何回报。