2013-06-19 3 views
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?

+0

Что делает '.add()' do? Разве это не должно быть с аргументом, который будет добавлен к выбранным элементам. На самом деле, '.add(). Get(). Join()' является путаницей. Не уверен, что это правильно и неуверенно в возврате. –

+0

Из [API] (http://api.jquery.com/add/) я не вижу никакой пользы от метода 'add()' без селектора; могу я спросить, почему он там? –

+0

Мне любопытно, что делает 'isEqual'. Поскольку 'get' также является функцией ajax, и, как сказал Vega, add требует аргумента. Иными словами, он ничего не делает. Я думаю, что 'add' и' get' могут быть удалены. Тогда все 'isEqual' будет создавать строку, которая представляет и массив элементов. – travis

ответ

5

Array's join() строит массив, поэтому вы полагаетесь на строгие версии набора элементов jQuery. Элементы DOM строятся в строке типа [object HTMLDivElement], так что вы действительно сравниваете размер, порядок и типы элементов в каждом объекте jQuery.

Например,

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

будет верно всегда, потому что оба селекторы захватить один <div> (то есть, они оба stringify в «[object HTMLDivElement]»), но очень редко следует это утверждение действительно верно.

Даже если некоторые браузеры сделали поставку способ однозначно идентифицировать элементы в их строковые представления, то toString поведение HTMLElement s не указан какой-либо стандарт, поэтому вы рискуете кросс-браузерной совместимости. (Поскольку это стоит, однако, не браузер не делает это, так что ваш код не работает должным образом в любом браузере.)

+0

ya, это правда, я знал, что чего-то не хватает, thx –

0

начать с ...

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

выдает ошибку и SequenceEqual дает «ложь»

1

Как вы сказали мне нужно сравнить, если разные селекторы возвращает тот же согласованный набор элементов

Как насчет этого упрощенного плагина -

;(function ($) { 
    $.fn.isEqual = function ($selector) { 
     return this.is($selector); 
    } 
})(jQuery); 
+0

Как насчет более сложного селектора слева или справа? Это полезно для одного элемента не для коллекции. Вам понадобится итерация, чтобы убедиться, что она работает с jQuery. –

+0

is() не работает наверняка, но thx для ввода –

+0

@Vega Пожалуйста, смотрите это [demo] (http://jsfiddle.net/g2UwK/8/), этот журнал действует для нескольких согласованных элементов. –

1

Уровень сравнения, что ваш .isEqual и .sequenceEqual отличается.

.isEqual - Сравнивает возвращаемые селекторы el.toString. Значение <div id="test"></div> будет таким же, как <div id="test1"></div>, и $('#test').isEqual('#test1') вернется true, так как сравнение составлено на основе toString, которое равно [object HTMLDivElement].

.sequenceEqual выполняет сравнение узлов, которое в основном выполняет итерации по всем элементам и сравнивает их по одному.

Выше с допущением, что ваш .add есть по ошибке.

DEMO:http://jsfiddle.net/2QYgp/

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

$(function() { 
    alert($('#test1').isEqual('#test')); 
}); 
+0

add() был использован, например, в этом случае: http://jsfiddle.net/WTkau/, где мы используем обратный метод. Это всего лишь пример, конечно, обратное здесь бесполезно. Но другой пример - это поиск потенциального делегата с использованием: $ (this) .parents(). Порядок добавления (document) отменен –

1

Это isEqual предполагает, что DOMNode.toString() производит строку, которая однозначно идентифицирует DOM узлов. И это неправильный предпосылка. AFAIR DOMElement.toString() не указан спецификациями W3C DOM, поэтому вы не можете полагаться на его результаты - они будут отличаться в разных UA.

Это sequenceEqual является правильным, если задача состоит в том, чтобы проверить равенство, но не, скажем, сходство.

+0

Это правильно, я больше искал сходства, чем равенство, так как порядок здесь не имеет особого значения. –

Смежные вопросы