【问题标题】:Is there a way to compare jQuery objects while ignoring the HTML attributes' ORDER?有没有办法在忽略 HTML 属性的 ORDER 的情况下比较 jQuery 对象?
【发布时间】:2014-05-20 15:03:33
【问题描述】:

使用 jQuery 的“is”函数运行以下比较将返回 false,因为 DOM 元素并不完全相同,尽管它们在视觉和功能上是相同的:

var $a = $('<div id="test" href="http://www.google.com"></div>');
var $b = $('<div href="http://www.google.com" id="test"></div>');
$a.is($b);//FALSE

使用 DOM 对象的直接比较也会返回 false。

查看运行示例:http://jsfiddle.net/6zqwn/5/

那么,有没有办法避免在比较时考虑属性的顺序?

(我为什么要问这个问题: 我在跨浏览器单元测试中使用这些比较,其中不同的浏览器会更改属性的顺序,同时仍然在功能上创建相同的 DOM 元素。)

【问题讨论】:

  • 我环顾四周,这似乎是一个更简单的解决方案:stackoverflow.com/a/19342581/2287470 - 例如$a.get(0).isEqualNode($b.get(0)) 或 $a[0].isEqualNode($b[0])。小提琴:jsfiddle.net/6zqwn/7 - 你可能遇到的唯一问题是它支持的唯一 IE 版本是 9+ (quirksmode.org/dom/core/mobile.html#t135 & quirksmode.org/dom/core/#t135)
  • 我们使用 div 是因为一个特定的边缘情况,客户端使用不正确支持锚标记的“混合”移动应用(包装 web 视图的本机代码)。
  • @Joe 你可以找到一些 shims 来处理 IE8,例如:code.ohloh.net/… 也就是说,你的评论应该是一个答案;)
  • @A.Wolff - 谢谢,但这是我链接到的答案中 Keen 的全部工作,我正好适合这个问题 :) 很高兴还有一个垫片!

标签: javascript jquery html unit-testing


【解决方案1】:

如果我们需要忽略属性的顺序,我们可以使用jQuery选择器作为“is”函数的参数,然后分别比较元素的内部HTML。

使用问题中的相同示例:

var $a = $('<div id="test" href="http://www.google.com"></div>');
var $b = $('<div href="http://www.google.com" id="test"></div>');
var selector = 'div#test[href="http://www.google.com"]';
($a.is(selector) == $b.is(selector)) && ($a.html() == $b.html());//TRUE

查看运行示例:http://jsfiddle.net/GuQ53/4/


更新

Joe 在 cmets 中链接到的更简单的解决方案是使用本机“isEqualNode”函数,它应该在 IE9+ 中工作并处理子元素。在此处查看解决方案:https://stackoverflow.com/a/19342581/1785003

【讨论】:

  • 这仍然很有趣,看看如何在 jQuery 中完成,谢谢分享!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 2019-10-19
  • 2020-02-11
相关资源
最近更新 更多