2016-10-04 3 views
1

Я хотел бы написать JQuery заявления типа:Использование: нет (: нет()) для эмуляции (гипотетический): есть() селектор в JQuery

$(".someparentcontainer input[type=checkbox]:is(.foo, .bar, .xyz)") 

В качестве краткого обозначения:

$(".someparentcontainer input[type=checkbox].foo, .someparentcontainer input[type=checkbox].bar, .someparentcontainer input[type=checkbox].xyz)") 

Поскольку JQuery не поддерживает (к моему знанию): есть() селектор я придумал следующий обходной путь:

$(".someparentcontainer input[type=checkbox]:not(:not(.foo, .bar, .xyz))") 

Я понимаю, что у него есть его недостатки с точки зрения производительности, если .someparentcontainer имеет тонну дочерних элементов, но он работает очень хорошо для небольших домиков.

Есть ли какие-нибудь подводные камни, которые мне могут не хватать здесь? Любые сценарии, в которых эта техника может потерпеть неудачу?

+1

Вы можете создать свой собственный псевдоселектор: https://jsfiddle.net/mLn1wbej/ –

ответ

1

Есть ли какие-нибудь подводные камни, которые могут у меня пропали? Любые сценарии, в которых эта техника может потерпеть неудачу?

Как вы отметили свой вопрос , the standard does not allow :not() to be nested within another :not(). Каждая известная реализация :not() в стандартном правильном обращается с тем, что у вас недействительно. Если jQuery разрешает это (я не могу сказать, что я удивлен, если это так), то это нестандартно, и вам нужно быть очень осторожным, чтобы не полагаться на него вне jQuery (например, он не будет работать в querySelectorAll(), или в CSS).

рекомендуется способ сделать это состоит в использовании .filter() вместо:

// If you know that the element with any of these ids is always a checkbox, 
// substitute ".someparentcontainer *" for the second selector string 
$(".someparentcontainer input[type=checkbox]").filter(".foo, .bar, .xyz") 

Но это означает, что вы должны написать две отдельные строки селектора. Опять же, нет никакого способа сделать это с помощью стандартного селектора, совместимого со стандартами, до тех пор, пока не будет реализован :matches() селекторов 4 (см. Does jQuery have something like the :any or :matches pseudo-class?).

+0

Я предполагаю, что ваш ответ подводит итог одной наземной мине, на которую люди должны следить. Поэтому я буду принимать это как ответ. Спасибо за понимание! – xDisruptor

2

Вы можете использовать функцию find Jquery в:

$("#someparentcontainer").find("#foo, #bar, #xyz").css('color', 'red')
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="someparentcontainer"> 
 
    <div id="foo">foo</div> 
 
    <div id="bar">bar</div> 
 
    <div id="abc">abc</div> 
 
</div> 
 
<div id="xyz">xyz</div>

Что делает гораздо больше смысла.

+0

+1 для подсказки в поиске. Однако разрыв селектора в двух частях будет представлять собой некоторые проблемы, если задействованы функции полезности, если указанные функции ожидают унифицированного селектора. Все будет усложняться, если упомянутые служебные функции являются частью сторонних библиотек. Подход .find() имеет свои преимущества, но по цене, аналогичной используемой: not (: not()). Не стесняйтесь меня опрокинуть, если я что-то упустил. – xDisruptor

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

  • Нет связанных вопросов^_^