2

異なるセレクターが同じ一致する要素のセットを返すかどうかを比較する必要があります。

私はこの簡単な解決策、小さなプラグインにたどり着きました:

;(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 ...

今、私が見つけた他のすべてのソリューションは、特権的なものと思われるこのような非常に精巧に見えるので、何かが欠けていると思います:

$.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;
} 

では、$.isEqual プラグインを使用することの欠点は何でしょうか?

4

5 に答える 5

5

配列join()は配列を文字列化するため、要素の jQuery セットの文字列化されたバージョンに依存しています。DOM 要素は のような文字列に文字列化される[object HTMLDivElement]ため、実際には、各 jQuery オブジェクト内の要素のサイズ、順序、および型のみを比較しています。

例えば、

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

両方のセレクターが 1 つをキャプチャする<div>(つまり、両方とも " [object HTMLDivElement]" に文字列化される) ため、常に true になりますが、このアサーションが実際に true になることはほとんどありません。

一部のブラウザー文字列表現の要素を一意に識別する方法を提供していたとしても、 s のtoString動作はHTMLElementどの標準でも指定されていないため、ブラウザー間の互換性が失われるリスクがあります。(ただし、現状では、これを行うブラウザーはありません。そのため、コードはどのブラウザーでも正しく動作しません。)

于 2013-06-19T16:07:33.353 に答える
1

.isEqualあなたとあなたの比較のレベル.sequenceEqualは異なります。

.isEqualel.toString-返されたセレクターを比較します。比較はwhich isに基づいているため、意味<div id="test"></div>は と同じに<div id="test1"></div>なり、 true を返します。$('#test').isEqual('#test1')toString[object HTMLDivElement]

.sequenceEqual基本的にすべての要素を反復処理し、1 つずつ比較するノード比較を行います。

.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

これは、 DOM ノードを一意に識別する文字列を生成することをisEqual前提としています。DOMNode.toString()そして、それは間違った仮定です。AFAIRDOMElement.toString()は W3C DOM 仕様で指定されていないため、その結果に依存することはできません。結果は UA ごとに異なります。

sequenceEqualタスクが同等性をテストすることである場合、それは正しいですが、たとえば、類似性はテストしません。

于 2013-06-19T16:20:01.513 に答える
1

あなたが言ったように、異なるセレクターが同じ一致した要素のセットを返すかどうかを比較する必要があります

この単純化されたプラグインはどうですか -

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