Ответ 1
Первое, что приходит мне на ум (возможно, оптимальное):
$('p').filter(function(){
return !$(this).attr('attr_all');
});
Однако p:not([attr_all])
должен работать, поэтому я думаю, что в вашем коде происходит что-то еще.
Я знаю, как получить элементы с определенным атрибутом:
$("#para [attr_all]")
Но как я могу получить элементы БЕЗ определенного атрибута? Я пытаюсь
$("#para :not([attr_all])")
Но это не сработает. Каков правильный способ сделать это?
Позвольте мне привести пример:
<div id="para">
<input name="fname" optional="1">
<input name="lname">
<input name="email">
</div>
JQuery
$("#para [optional]") // give me the fname element
$("#para :not([optional])") //give me the fname, lname, email (fname should not appear here)
Первое, что приходит мне на ум (возможно, оптимальное):
$('p').filter(function(){
return !$(this).attr('attr_all');
});
Однако p:not([attr_all])
должен работать, поэтому я думаю, что в вашем коде происходит что-то еще.
Если ваш пример кода - это точный код, который вы используете, я думаю, что проблема - странное пространство.
$("#para :not([attr_all])")
должен быть
$("#para:not([attr_all])")
Если вы оставите там пробел, он выбирает потомки #para
.
Более быстрый способ сделать это - сначала получить все элементы с идентификатором para (который является недопустимым HTML, если их несколько, подумайте об использовании класса) и используйте фильтр (или найдите в зависимости от того, как HTML), чтобы получить только элементы без атрибута:
$('#para').filter(':not([attr_all])');
У вас есть jQuery, делайте гораздо меньше работы, потому что вы только зацикливаете меньший поднабор элементов, чтобы получить те, у которых нет атрибута. Выполнение этого с помощью одного оператора селектора, например $("#para :not([attr_all])")
, приведет к тому, что jQuery получит все элементы без атрибута, а затем отфильтрует их для тех, у которых есть идентификатор параграфа.
Попробуйте $("#para [attr!=val]")
.
Ваш :not
действительно должен работать, хотя, что заставляет меня подозревать, что что-то еще происходит.
Полный список селекторов атрибутов см. в jQuery Selectors docs.
Ответ Франка Дероса о правильном, но поскольку OP хочет найти потомков, он немного выключен. Попытавшись самостоятельно, кажется, что он должен работать так, как есть, но возможно, что все, что вы используете, не нравится, когда оператор ":" используется непосредственно как потомок. Попробуйте использовать
$("#para input:not([optional])")
Оставил комментарий, но пока не может.