我们如何比较两个 HTML 元素是否相同?
我试过这个东西但没有运气
<div class="a"> Hi this is sachin tendulkar </div>
<div class="a"> Hi this is sachin tendulkar </div>
然后在单击按钮时,我调用函数 check()
var divs = $(".a");
alert(divs.length); // Shows 2 here which is correct
if (divs.get(0) == divs.get(1)) alert("Same");
但这是行不通的。两个 div 中的一切都相同。除此之外,我们如何比较两个 HTML 元素是否完全相同。包括它们的innerHTML、className、Id,以及它们的属性。
这可行吗?
实际上,我有两个 HTML 文档,我想从它们中删除相同的内容所以两个元素可以有相同的 id。
PS:根据克劳德的宝贵意见更新。如果我们将两个元素作为字符串进行比较,我们将无法获得匹配项,因为它们的属性顺序可能不同所以唯一的选择是遍历每个子属性并进行匹配。我仍然需要找出完全可行的实施策略。
原文由 Sachin Jain 发布,翻译遵循 CC BY-SA 4.0 许可协议
更新
请参阅 Keen 的回答 以及 ccproj 对一个密切相关问题的回答。有
isEqualNode
,但它比较class
和style
属性作为文本类或同一组文本类的不同顺序属性让它认为节点不相等。 ccprog 的回答 可以解决这个问题。原始答案
(请参阅下面的完整的、大部分未经测试的、当然也没有重构的现成解决方案。但首先,它的点点滴滴。)
比较他们的
innerHTML
很简单:…尽管您必须问自己这两个元素是否符合您的标准:
…因为他们的
innerHTML
会有所 _不同_(至少在 Chrome 上是这样,我怀疑即使不是所有浏览器也是如此)。 (更多内容见下文。)然后你需要比较它们的所有属性。据我所知,jQuery 不提供枚举属性的方法,但 DOM 提供:
然后
请注意,通过对上面的数组进行排序,我假设它们的属性顺序在您定义的“等效”中并不重要。我希望是这样,因为它似乎没有被保留,因为我在运行 这个测试 时从不同的浏览器得到不同的结果。既然如此,我们必须回到
innerHTML
问题,因为如果元素本身的属性顺序不重要,那么后代元素的属性顺序可能也不重要。如果 是 这种情况,您将需要一个递归函数来根据您的等效定义检查后代,并且根本不使用innerHTML
。然后是 后续问题 引起的关注:如果元素具有不同但等效的
style
属性怎么办?例如:我在那里的回答 通过遍历元素
style
对象的内容来解决它,如下所示:可悲的是,正如我在那个答案中所说:
但是你应该能够将上面的部分放在一起,根据你的标准比较两个元素。
更多探索:
这个问题让我很感兴趣,所以我想了一会儿,想出了以下问题。它大部分未经测试,可以使用一些重构等,但它应该可以帮助您完成大部分工作。我再次假设属性的顺序并不重要。以下假设文本中即使是最细微的差异 也是 重要的。
现场示例: