2

I need to compare if different selectors returns same matched set of elements.

I came to this easy solution, a little plugin:

;(function ($) {
    $.fn.isEqual = function ($selector) {
       return this.add().get().join() === $selector.add().get().join()
    }
})(jQuery);


//e.g of usages: if($('div').isEqual($('#mydiv1,#mydiv2'))
//if($(':checkbox').isEqual($('input[type=checkbox].myclass'))
//if($('div').parents().isEqual($('body div').parents()) etc ...

Now i think i'm missing something as all other solutions i have find seems really more elaborate, like this one which seems to be the privileged one:

$.fn.sequenceEqual = function(compareTo) {
  if (!compareTo || !compareTo.length || this.length !== compareTo.length) {
    return false;
  }
  for (var i = 0, length = this.length; i < length; i++) {
    if (this[i] !== compareTo[i]) 
      return false;
    }
  }
  return true;
} 

So, what can be the downside of using $.isEqual plugin?

4

5 回答 5

5

Array 对join()数组进行字符串化,因此您依赖于 jQuery 元素集的字符串化版本。DOM 元素字符串化为类似 的字符串[object HTMLDivElement],因此实际上您只是在比较每个 jQuery 对象中元素的大小、顺序和类型。

例如,

$("div:first").isEqual($("div:last"))

将永远为真,因为两个选择器都捕获一个<div>(即,它们都字符串化为“ [object HTMLDivElement]”),但这种断言实际上很少为真。

即使某些浏览器确实提供了一种方法来唯一地标识其字符串表示中的元素,但任何标准都没有指定 s 的toString行为HTMLElement,因此您会冒跨浏览器兼容性的风险。(然而,目前没有浏览器这样做,因此您的代码在任何浏览器中都无法正常工作。)

于 2013-06-19T16:07:33.353 回答
1

正如你所说,我需要比较不同的选择器是否返回相同的匹配元素集

这个简化的插件怎么样 -

;(function ($) {
    $.fn.isEqual = function ($selector) {
       return this.is($selector);
    }
})(jQuery);
于 2013-06-19T16:06:35.973 回答
1

.isEqual你和.sequenceEqual不同的比较水平。

.isEqual- 比较el.toString返回的选择器。含义<div id="test"></div>将与相同<div id="test1"></div>并且$('#test').isEqual('#test1')将返回 true,因为比较基于toStringwhich is [object HTMLDivElement]

.sequenceEqual进行节点比较,它基本上遍历所有元素并一一比较。

以上假设您.add是错误的。

演示:http: //jsfiddle.net/2QYgp/

(function ($) {
    $.fn.isEqual = function ($selector) {
           return this.get().join() === $($selector).get().join()
    }
})(jQuery);

$(function () {
    alert($('#test1').isEqual('#test'));
});
于 2013-06-19T16:19:51.593 回答
1

isEqual假设DOMNode.toString()生成一些唯一标识 DOM 节点的字符串。这是错误的假设。W3C DOM 规范未指定AFAIR DOMElement.toString(),因此您不能依赖其结果 - 它们在不同的 UA 中会有所不同。

sequenceEqual如果任务是测试相等性,而不是相似性,那是正确的。

于 2013-06-19T16:20:01.513 回答
0

开始...

if($('div').isEqual('#mydiv1,#mydiv2'))

给出错误,而 sequenceEqual 给出“假”

于 2013-06-19T16:06:05.627 回答