javascript递归函数中存在错误
我有以下代码(在本例中,可以将其视为从作为输入的有效html字符串中删除属性的函数): 函数解析(htmlStr) { console.log(htmlStr); 结果+=”; var nodes=htmlStr.childNodes;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。你没
对于(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;iThisresult+=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中附加检查