Эффективный способ найти элементы, не содержащиеся в другом элементе - PullRequest
1 голос
/ 27 февраля 2012

Какой самый эффективный способ найти элементы, соответствующие селектору, которые не находятся внутри данного узла DOM (т. Е. Я прошел узел и не могу обязательно вывести селектор, чтобы сопоставить его). Пока у меня есть

var inputs = $("input").filter(function() {
    return !$(excludedNode).has(this).length;
});

Но не могу не думать, что может быть лучшее решение, чем это, поскольку, несмотря на то, что он не очень большой, я сомневаюсь, что он очень эффективен.

Ответы [ 5 ]

2 голосов
/ 29 февраля 2012

Я настроил jsperf , чтобы проверить действительные предложения, сделанные другими людьми, и еще одну идею.

Удивительно, но метод с использованием $.has примерно в 3 раза быстрее, чем с использованием $.closest (так как он делегирует браузеру document.element.contains, тогда как $.closest выполняет некоторые манипуляции с селекторами и пересекает дерево DOM). Это также быстрее, чем $("div").not("#" + id + " *") примерно на такую ​​же разницу.

Итак, самый быстрый метод -

$("input").filter(function() {
    return !$(excludedNode).has(this).length;
});

и использование $.closest, которое интуитивно чувствуется как самый быстрый способ, на самом деле является самым медленным

2 голосов
/ 27 февраля 2012

Как насчет этого:

var inputs = $("input").filter(function() {
    return $(this).closest(excludedNode).length == 0
    //or:
    return !$(this).closest(excludedNode).length
});

Он находит нужные элементы, а затем проверяет, имеет ли родительский элемент excludedNode

1 голос
/ 27 февраля 2012

Если «исключенный узел» имеет «идентификатор» или что-то, что можно использовать в качестве селектора, есть:

var inputs = $('input').not('#excluded *');

или

var inputs = $('input').not('#' + node.id + ' *');
0 голосов
/ 27 февраля 2012
var inputs = $('input').not('*', excludedNode);

или

var inputs = $('input').not('*', $(excludedNode));

это выглядит лучше.

0 голосов
/ 27 февраля 2012
$('input').not('#someID input').doSOmething()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...