javascript递归函数中存在错误

javascript递归函数中存在错误,javascript,jquery,html,dom,nodes,Javascript,Jquery,Html,Dom,Nodes,我有以下代码(在本例中,可以将其视为从作为输入的有效html字符串中删除属性的函数): 函数解析(htmlStr) { console.log(htmlStr); 结果+=”; var nodes=htmlStr.childNodes; 对于(i=0;i您的结果变量有问题。它是未定义的全局变量。在每次递归中,您都会将相同的字符串附加到它本身,这也会使它因大量输入而崩溃。(我无法复制任何内容,它会立即崩溃,并出现未定义变量错误) 顺便说一句:你的参数不是htmlStr,它是一个domNode。你没

我有以下代码(在本例中,可以将其视为从作为输入的有效html字符串中删除属性的函数):

函数解析(htmlStr) { console.log(htmlStr); 结果+=”; var nodes=htmlStr.childNodes;
对于(i=0;i您的
结果
变量有问题。它是未定义的全局变量。在每次递归中,您都会将相同的字符串附加到它本身,这也会使它因大量输入而崩溃。(我无法复制任何内容,它会立即崩溃,并出现
未定义变量
错误)

顺便说一句:你的参数不是
htmlStr
,它是一个
domNode
。你没有解析任何东西。请不要使用错误的自文档变量名

更正版本:

function serialize(domElement) {
    var tagname = domElement.tagName.toLowerCase();
    var result = "<"+tagname+">";
//  ^^^       ^ not a +=
    var children = domElement.childNodes;
    for (var i=0; i<children.length ;i++) {
//       ^^^ was also missing
         if (children[i].nodeType == 3) {
             result += children[i].data;
         } else if (children[i].nodeType == 1) {
             result += serialize(children[i]);
//                  ^^ add a child's result here
         }
    }
    result += "</"+tagname+">";
    return result;
}
函数序列化(doElement){
var tagname=domeElement.tagname.toLowerCase();
var结果=”;
//^^^^^不是一个+=
var children=doElement.childNodes;

对于(var i=0;i您的
结果
变量有问题。它是未定义的全局变量。在每次递归中,您都会将相同的字符串附加到它本身,这也会使它因大量输入而崩溃。(我无法复制任何内容,它会立即崩溃,并出现
未定义变量
错误)

顺便说一句:你的参数不是
htmlStr
,它是一个
domNode
。你没有解析任何东西。请不要使用错误的自文档变量名

更正版本:

function serialize(domElement) {
    var tagname = domElement.tagName.toLowerCase();
    var result = "<"+tagname+">";
//  ^^^       ^ not a +=
    var children = domElement.childNodes;
    for (var i=0; i<children.length ;i++) {
//       ^^^ was also missing
         if (children[i].nodeType == 3) {
             result += children[i].data;
         } else if (children[i].nodeType == 1) {
             result += serialize(children[i]);
//                  ^^ add a child's result here
         }
    }
    result += "</"+tagname+">";
    return result;
}
函数序列化(doElement){
var tagname=domeElement.tagname.toLowerCase();
var结果=”;
//^^^^^不是一个+=
var children=doElement.childNodes;
对于(var i=0;iThis
result+=parse(node);
->在您的情况下,不应该像这样在递归中合并结果

发生的情况是,
递归调用的返回结果将现有结果与返回结果相加。其中,现有结果是
Hi I am
,返回结果是
Hi I amTest
,因此在递归结束时,您有
Hi I amHi I amTest

var result = '';
function parse(htmlStr) {        
    result += "<" + htmlStr.tagName.toLowerCase() + ">";    
    var nodes = htmlStr.childNodes;
    for (i = 0; i < nodes.length; i++) {
        var node = nodes[i];        
        if (node.nodeType == 3) {
            var text = $.trim(node.nodeValue);
            if (text !== "") {
                result += text;
            }
        } else if (node.nodeType == 1) {            
            parse(node);
        }
    }
    console.log(result);
    result += "</" + htmlStr.tagName.toLowerCase() + ">";
    return result;
}
var结果=”;
函数解析(htmlStr){
结果+=”;
var nodes=htmlStr.childNodes;
对于(i=0;i
修复了fiddle:

这个
结果+=parse(node);
->在您的情况下,不应该像那样在递归中合并结果

发生的情况是,
递归调用的返回结果将现有结果与返回结果相加。其中,现有结果是
Hi I am
,返回结果是
Hi I amTest
,因此在递归结束时,您有
Hi I amHi I amTest

var result = '';
function parse(htmlStr) {        
    result += "<" + htmlStr.tagName.toLowerCase() + ">";    
    var nodes = htmlStr.childNodes;
    for (i = 0; i < nodes.length; i++) {
        var node = nodes[i];        
        if (node.nodeType == 3) {
            var text = $.trim(node.nodeValue);
            if (text !== "") {
                result += text;
            }
        } else if (node.nodeType == 1) {            
            parse(node);
        }
    }
    console.log(result);
    result += "</" + htmlStr.tagName.toLowerCase() + ">";
    return result;
}
var结果=”;
函数解析(htmlStr){
结果+=”;
var nodes=htmlStr.childNodes;
对于(i=0;i
固定小提琴:

改变

result+="<"+htmlStr.tagName.toLowerCase()+">";
result+=”;
致:

var结果=”;
在演示中运行良好:

更改

result+="<"+htmlStr.tagName.toLowerCase()+">";
result+=”;
致:

var结果=”;

在演示中工作正常:

由于循环控制变量未在本地作用域内,因此发生崩溃。因此,除了其他建议的更改外:

对于(vari=0;i

发生崩溃是因为循环控制变量的作用域不在本地。因此,除了其他建议的更改外:

对于(vari=0;i

可能是由于javascript的不引人注目的特性?那么预期的结果应该是什么呢?@Vega:不应该只是
Hi-I-amTest
?@Vega:甚至
console.log(htmlStr)
只显示一次
,那么它为什么会被打印两次呢?可能是因为javascript的不引人注目的特性?那么预期的结果应该是什么呢?@Vega:它不应该只是
Hi I amTest
?@Vega:甚至
console.log(htmlStr)
显示
一次,那么它为什么会被打印两次呢?ohk,但是使用全局变量还有其他选择吗?谢谢你的最后一个建议,使用regexp比trim.ohk好,但是使用全局变量还有其他选择吗?谢谢你的最后一个建议,使用regexp比trim好在html中附加一个
检查
,页面崩溃!甚至小提琴:P@gopi1410这是你的递归逻辑:P不管怎样。让我检查一下它失败的原因。很可能是因为尾部递归。是的,我知道:P但我只能使用这个。也许正如Vega所说,这是由于全局变量。@gopi1410不..不是那样..但是使用局部变量是的建议..但是添加另一个子节点会导致无休止的递归。如果我在html中添加一个
检查
,页面会崩溃!即使是小提琴:P@gopi1410这是你的递归逻辑:P无论如何,让我检查一下它为什么失败,很可能是因为尾部递归。是的,我知道:P但我只能用这个。也许是作为织女星说这是由于全局变量引起的。@gopi1410 Nope..不是那样..但建议使用local..但是添加另一个子节点会导致无休止的递归。请选中在htmlCheck a中附加
检查