Javascript 递归函数中的返回不';t退出函数
我很难修复我的递归函数,它是一个用于扫描DOM项并在文档中找到匹配元素的简化工具Javascript 递归函数中的返回不';t退出函数,javascript,recursion,Javascript,Recursion,我很难修复我的递归函数,它是一个用于扫描DOM项并在文档中找到匹配元素的简化工具 find: function(selector, element) { if(selector !== undefined) { if(element === undefined) { element = this.e; } var elements = element.childNodes; for(var i = 0
find: function(selector, element) {
if(selector !== undefined) {
if(element === undefined) {
element = this.e;
}
var elements = element.childNodes;
for(var i = 0; i < elements.length; i++) {
if(elements[i].nodeType === 1) {
console.log(elements[i]);
if(this.has_class(selector, elements[i]) === true) {
console.log('YAY, found it', elements[i]);
return elements[i];
} else {
if(elements[i].childNodes.length > 0) {
this.find(selector, elements[i]);
}
}
}
}
}
return false;
}
find:函数(选择器、元素){
如果(选择器!==未定义){
如果(元素===未定义){
元素=这个.e;
}
var elements=element.childNodes;
对于(var i=0;i0){
this.find(选择器,元素[i]);
}
}
}
}
}
返回false;
}
所以函数应该扫描给定DOM元素的子元素(可能还有它们的子元素)并返回找到的元素,否则就深入一步再试一次
这是可调试的
正如您在日志中看到的,它触发了console.log('found');但它并没有离开返回它的函数,而是继续并最终返回false(截至NotFound)。怎么能修好呢
var工具={
e:document.querySelector('.breadcrumbs'),
has_类:函数(名称、元素){
if(element.className==名称){
返回true;
}
返回false;
},
查找:函数(选择器、元素){
如果(选择器!==未定义){
如果(元素===未定义){
元素=这个.e;
}
var elements=element.childNodes;
对于(var i=0;i0){
this.find(选择器,元素[i]);
}
}
}
}
}
返回false;
}
};
console.log(tools.find('test'))代码>
俄罗斯-沙特阿拉伯
return
退出对找到元素的find
的调用,但不会解除所有导致该元素的调用
而不是
this.find(selector, elements[i]);
…在您的else
中,您需要查看是否已获取元素,如果已获取,请返回:
var result = this.find(selector, elements[i]);
if (result) {
return result;
}
让它在链条上传播
更新的实时示例:
var工具={
e:document.querySelector('.breadcrumbs'),
has_类:函数(名称、元素){
if(element.className==名称){
返回true;
}
返回false;
},
查找:函数(选择器、元素){
如果(选择器!==未定义){
如果(元素===未定义){
元素=这个.e;
}
var elements=element.childNodes;
对于(var i=0;i0){
var result=this.find(选择器,元素[i]);
如果(结果){
返回结果;
}
}
}
}
}
}
返回false;
}
};
console.log(tools.find('test'))代码>
俄罗斯-沙特阿拉伯
return
退出对找到元素的find
的调用,但不会解除所有导致该元素的调用
而不是
this.find(selector, elements[i]);
…在您的else
中,您需要查看是否已获取元素,如果已获取,请返回:
var result = this.find(selector, elements[i]);
if (result) {
return result;
}
让它在链条上传播
更新的实时示例:
var工具={
e:document.querySelector('.breadcrumbs'),
has_类:函数(名称、元素){
if(element.className==名称){
返回true;
}
返回false;
},
查找:函数(选择器、元素){
如果(选择器!==未定义){
如果(元素===未定义){
元素=这个.e;
}
var elements=element.childNodes;
对于(var i=0;i0){
var result=this.find(选择器,元素[i]);
如果(结果){
返回结果;
}
}
}
}
}
}
返回false;
}
};
console.log(tools.find('test'))代码>
俄罗斯-沙特阿拉伯
对find
的递归调用的结果未被处理。您应该检查递归调用的结果值,并在递归调用找到元素时返回其值:
find: function(selector, element) {
if(selector !== undefined) {
if(element === undefined) {
element = this.e;
}
var elements = element.childNodes;
for(var i = 0; i < elements.length; i++) {
if(elements[i].nodeType === 1) {
console.log(elements[i]);
if(this.has_class(selector, elements[i]) === true) {
console.log('YAY, found it', elements[i]);
return elements[i];
} else {
var foundElement = this.find(selector, elements[i]);
// *** Added this check to return the located element from the recursive call
if (foundElement != false) {
return foundElement;
}
}
}
}
}
return false;
}
find:函数(选择器、元素){
如果(选择器!==未定义){
如果(元素===未定义){
元素=这个.e;
}
var elements=element.childNodes;
对于(var i=0;i