将html节点传递给javascript函数
我是JavaScript新手,试图创建一个递归函数来检查两个DOM节点是否等效。这个函数似乎对所有东西都返回true,并且不按照我想要的方式检查DOM。只有节点是等效的。将html节点传递给javascript函数
var htmlStrings = ['<div id="one">Some<span>node <em>contents</em> for</span>comparison</div>', '<div id="two">Some<span>node contents for</span>comparison</div>', '<div id="one">Some<span>node <strong>contents</strong> for</span>comparison</div>', '<div id="four">Some<span>node <em>contents</em> for</span>comparison</div>'];
var div1 = document.createElement('div');
div1.innerHTML = htmlStrings[0];
document.body.appendChild(div1);
var div2 = document.createElement('div');
div2.innerHTML = htmlStrings[1];
document.body.appendChild(div2);
var div3 = document.createElement('div');
div3.innerHTML = htmlStrings[2];
document.body.appendChild(div3);
var div4 = document.createElement('div');
div4.innerHTML = htmlStrings[3];
document.body.appendChild(div4);
function nodeEquivalence(node1, node2) {
var passed = false;
if (node1.nodeType === node2.nodeType) {
if ((node1.tagName === node2.tagName && node1.nodeValue === node2.nodeValue)) {
passed = true;
}
}
node1 = node1.firstChild;
node2 = node2.firstChild;
while (node1 && node2) {
nodeEquivalence(node1, node2);
node1 = node1.nextSibling;
node2 = node2.nextSibling;
}
return passed;
}
console.log(nodeEquivalence(div1, div2));
console.log(nodeEquivalence(div1, div4));
您正在传递字符串,而不是DOM元素。您需要将HTML转换为DOM元素。有在
Creating a new DOM element from an HTML string using built-in DOM methods or prototype
描述,你可以做很多的解决方案:
var html1 = '<div id="one">Some<span>node <em>contents</em> for</span>comparison</div>';
var html2 = '<div id="four">Some<span>node <em>contents</em> for</span>comparison</div>';
var html3 = '<div id="one">Some<span>node <b>contents</b> for</span>comparison</div>';
var div1 = document.createElement('div');
div1.innerHTML = html1;
var div2 = document.createElement('div');
div2.innerHTML = html2;
var div3 = document.createElement('div');
div3.innerHTML = html3;
alert(nodeEquivalence(div1.firstChild, div2.firstChild));
alert(nodeEquivalence(div1.firstChild, div3.firstChild));
function nodeEquivalence (node1, node2) {
var passed = true;
function test(node1, node2) {
if ((node1.nodeType === node2.nodeType) && (node1.tagName === node2.tagName || node1.nodeValue === node2.nodeValue) && (node1.childNodes.length === node2.childNodes.length)) {
passed = true;
} else {
passed = false;
}
}
node1 = node1.firstChild;
node2 = node2.firstChild;
while (passed && node1 && node2) {
test(node1, node2);
node1 = node1.nextSibling;
node2 = node2.nextSibling;
}
//test(document.body);
return passed;
};
对不起,我在测试后重新排序了代码,并没有注意到您使用了函数赋值而不是函数声明。我现在修好了。 – Barmar
谢谢。所以这个未定义的问题是用这段代码解决的,但是当我在chrome开发工具中尝试它时,它对所有的东西都返回true。只有div1和div4是相等的。更新后的代码。 – devdropper87
只要两个节点的子节点数相同,就可以设置“passed = true”。那么如果孩子不匹配,你从来没有把它设置为“假”。 – Barmar
使用document.createElement(*tagName*)
Here是一些文档。
例如,您需要创建两个元素,将它们都传入并查看它们是否相等。然后你可以在同一个基础上两次。
var newDiv = document.createElement("div");
var newSpan = document.createElement("span");
肯定的,而不是比较2个HTML元素,你简单地比较两个字符串。而你的node1,node2将永远是未定义的。顺便说一下,下面这个关于如何比较2个html元素的例子有一些不错的例子。
最相关的部分是innerHTML的。大部分信息都在那里。如果两个HTML节点的innerHTML相同,则几乎所有内容都是相同的。比标签名和<input>
标签类型属性:
function nodeEquivalence(node1, node2) {
var equal = false;
if (node1.innerHTML === node2.innerHTML) {
if (node1.tagName === node2.tagName) {
if (node1.type === node2.type) {
equal = true;
}
}
}
return equal;
}
我觉得,这个功能将赶上几乎所有的案例。
注意,是有差别不大,如果您通过ID或类名访问节点:
var el = document.getElementById(id);
el.innerHTML
var el2 = document.getElementsByClassName(className);
el[0].innerHTML;
此外,您还可以通过outerHTML比较。当您为每个HTML节点提供相同的类名时,您将拥有完全相同的内容。
创建HTML元素:
var div = document.createElement("div");
var text = document.createTextNode("some text");
div.appendChild(text);
document.body.appendChild(div);
您的nodeEquivalence函数太复杂。看,我是怎么做到的。 InnerHTML通常用于设置标签中的文本。但这不是正确的方法。 InnerHTML就是名称所说的“HTML中的内容”(整个HTML树)。要设置文本使用textContent或createTextNode。消息“未定义”出现,因为您没有将其附加到文档中。我会更新我的答案来清除它! – Sun
document.body.appendChild(el)缺失。 – Sun
该功能是正确的! div1中的innerHTML有另一个id,而不是div4。现在创建一个文本节点,并在节点中放入HTML。这不是这个意思。 CreateTextNode是用来创建纯文本的! http://jsfiddle.net/zh61e9qb/4/ – Sun
请清除你的问题有点称号。 http://stackoverflow.com/help/how-to-ask。谢谢! – Sun