Выбрать элементы по атрибуту

253

У меня есть коллекция флажков с сгенерированными идентификаторами, и некоторые из них имеют дополнительный атрибут. Можно ли использовать JQuery, чтобы проверить, имеет ли элемент определенный атрибут? Например, могу ли я проверить, имеет ли следующий элемент атрибут «myattr»? Значение атрибута может варьироваться.

<input type="checkbox" id="A" myattr="val_attr">A</input>

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

Киприан Гросу
источник
2
Кроме того, <input /> - это пустой тег, который не предназначен для содержания внутри него. Возможно, вас не интересует проверка наличия у меня myatttr ...
ScottE
Если у вас уже есть коллекция и вы хотите отфильтровать только элементы с определенным атрибутом - просто сделайте это$filtered = $collection.filter('[attribute_name]');
jave.web

Ответы:

190

Вы имеете в виду, вы можете выбрать их? Если так, то да:

$(":checkbox[myattr]")
Клетус
источник
4
Обратите внимание, что если вы проверяете существование (предположительно в операторе if, например), то, вероятно, более правильно / надежно это сделать: if ($ (": checkbox [myattr]"). Length ()> 0) ...
Риного
14
@rinogo: на самом деле все, что вам нужно, это if ($ (": checkbox [myattr]"). length). () После длины не требуется, равно как и> 0, 0 оценивается как ложное в тестах на равенство, которые не требуют строгого равенства (как значения, так и типа).
bmarti44
1
Выдает ошибки js, если вы попробуете что-то вроде: td [myattr]. Поэтому я думаю, что эта функция была специально нацелена на флажки.
fooledbyprimes
6
Двоеточие выбирает псевдоклассы, определяемые типом attr. Чтобы применить то же самое к тд, просто опустите двоеточие.
Дхочи
Или, если вы хотите узнать, не имеет ли что-то атрибута, например, найти все ссылки, которые не имеют hrefатрибутов. $("#myBox").find('a').filter(':not([href])')
тембра
368
if ($('#A').attr('myattr')) {
    // attribute exists
} else {
    // attribute does not exist
}

РЕДАКТИРОВАТЬ:

Приведенное выше попадет в elseветвь, когда она myattrсуществует, но будет пустой строкой или "0". Если это проблема, вы должны явно проверить undefined:

if ($('#A').attr('myattr') !== undefined) {
    // attribute exists
} else {
    // attribute does not exist
}
Стефан Гериг
источник
3
Не очень хороший ответ. «undefined» не является ключевым словом в Javascript. См. Constc.blogspot.com/2008/07/…
mhenry1384
16
Вы правы ... Но переопределение undefinedсчитается крайним случаем, и приведенное выше сравнение будет работать в 99% всех случаев.
Стефан Гериг
6
Не работает, если атрибут содержит пустую строку. Примером является myattr = ''
мифический программист
3
@mhenry - тогда вы будете ошибаться :) Если бы вы строили проект для меня или вместе со мной, я бы потребовал, чтобы вы исправили свою ошибку. Если бы это был пакет с открытым исходным кодом, то я (вместе со многими пользователями) прекратил бы его использование на том основании, что он был плохо закодирован. Если вы не измените его, тогда кто-то в конечном итоге раскошелится на версию без ошибки, и люди будут использовать ее вместо этого, и вы потеряете свой собственный проект, как это было много раз раньше, когда кто-то создает пакет, который является хорошей идеей с плохая реализация. В любом случае это преподало бы вам урок о практике кодирования :)
Джимбо Джонни
8
if (typeof $ ('# A'). attr ('myattr')! == 'undefined')
Джеймс Вестгейт,
166

Я знаю, что прошло много времени с тех пор, как был задан вопрос, но я обнаружил, что проверка была более ясной, как это:

if ($("#A").is('[myattr]')) {
    // attribute exists
} else {
    // attribute does not exist
}

(Как найдено на этом сайте здесь )

Документация об этом может быть найдена здесь

Джонатан Бержерон
источник
Согласно W3C, логические атрибуты определяются наличием или отсутствием атрибута. jQuery предоставляет метод .attr () для управления значениями атрибутов. Но как мы можем добавить атрибут без значения? Метод, который вы предоставляете для проверки наличия атрибута, не описан в документации jQuery (1.8.2). Вы знаете, как добавить атрибут с помощью jQuery?
chmike
@chmike Чтобы добавить атрибут, я бы сделал это следующим образом: $ ("# A"). prop ("myNewAttribute", someValue); Вы можете задать someValue любое значение по вашему выбору: строка, число, пустая строка, true / false.
Джонатан Бержерон
Это добавит атрибут с присвоенным значением, которое не совпадает с атрибутом без значения.
chmike
5
Я согласен, это лучший ответ (с использованием jQuery) - очень четкий и лаконичный. Мне стало интересно, почему jQuery не просто имеет функцию hasAttribute (), и ответ таков: у нативного javascript она уже есть. У любого элемента HTML Dom есть метод hasAttribute ('attributeName'). Так что вы можете сделать: $ ('# A') [0] .hasAttribute ('myattr') @chmike - я не думаю, что вы можете добавить пустой атрибут, используя функции jQuery, но вы можете сделать это с помощью элемента HTML Dom. Объект аналогично следующему: $ ("# A") [0] .setAttributeNode (document.createAttribute ("myNewAttribute"));
Дэниел Ховард
1
Просто комментарий, который мне нравится этот ответ, но был озадачен комментариями, спрашивающими, как добавить атрибут без значения. Они не связаны с вопросом или ответом.
Goodeye
9

Это будет работать:

$('#A')[0].hasAttribute('myattr');
powermikee
источник
2
см. ссылку: stackoverflow.com/questions/1318076/…
RetroCoder
@RetroCoder, что вы думаете о своей ссылке? Этот тест , кажется , довольно хорошо, особенно потому , что часто используется , $(this).<something>когда здесь вы можете сделать this.hasAttribute('...')прямо (и не заботитесь о старых браузерах, конечно.)
Алексис Вилька
8

В JavaScript ...

null == undefined

... возвращает true*. Это разница между ==и ===. Кроме того, имя undefinedможет быть определено (это не ключевое слово, как nullесть), поэтому вам лучше проверить другим способом. Наиболее надежным способом, вероятно, является сравнение возвращаемого значения typeofоператора.

typeof o == "undefined"

Тем не менее, сравнение с нулем должно работать в этом случае.

* Предполагается, undefinedчто на самом деле не определено.

bambams
источник
Undefined не является зарезервированным ключевым словом в JavaScript. В jQuery возможно изменить его имя именно потому, что оно создано с помощью конструктора "var" и не имеет значения. Вверху магического библиотечного кода, на самом деле, есть строка, которая гласит «var undefined;» и таким образом неопределенная переменная определяется с этим именем в области видимости jQuery ... Но все равно ее можно назвать «безымянный», набрав «var unonym;»
Эмануэле Дель Гранде
1
Это не проверка для атрибута, это проверка для свойства в объекте javascript, почему это имеет 6 голосов?
ncubica
5

$("input[attr]").length может быть лучшим вариантом.

ОСГО
источник
4

Несколько идей были отброшены с использованием "typeof", jQuery ".is" и ".filter", поэтому я решил опубликовать быстрое сравнение их. Typeof, кажется, лучший выбор для этого. В то время как другие будут работать, при вызове библиотеки jq для этого усилия, похоже, будет существенная разница в производительности

Daved
источник
2
if (!$("#element").attr('my_attr')){
  //return false
  //attribute doesn't exists
}
неистовство
источник
1
это, вероятно, не сработает, так как вы можете добавить атрибут без значения. в таком случае это условие пройдет, хотя желаемое поведение может возвращать true, атрибут установлен. похож на PHP isset()или, например, в js $("#element").attr('my_attr') === false,
ulkas
2

как и в этом посте , используя .isи селектор атрибутов [], вы можете легко добавить функцию (или прототип):

function hasAttr($sel,attr) {
    return $sel.is('['+attr+']');
}
DHC
источник
1
$("input#A").attr("myattr") == null
Матиас Ф
источник
1
$ (). attr () не будет возвращать ноль, как предложено в нашем примере, вместо этого он будет возвращать неопределенное.
Стефан Гериг
У меня работает в firebug, но это может быть вещь firebug
Mathias F
Еще не пробовал, но так написано в документации: docs.jquery.com/Attributes/attr#name
Стефан Гериг,
1

просто:

$('input[name*="value"]')

больше информации: официальные документы

Камбиз
источник
1
Неэкранированные двойные кавычки в строке, определенной двойными кавычками, не являются допустимой строкой. К сожалению, я не могу отредактировать это для вас, потому что редактирование должно изменить 6 или более символов, но должно быть изменено.
Джимбо Джонни
0

Помимо выбора всех элементов с атрибутом $('[someAttribute]')или $('input[someAttribute]')вы также можете использовать функцию для выполнения логических проверок объекта, например, в обработчике щелчков:

if(! this.hasAttribute('myattr') ) { ...

AaronLS
источник
0

Я создал пакет npm с предполагаемым поведением, как описано выше в вопросе.

Ссылка на [npm] и [github]

Использование очень просто. Например:

<p id="test" class="test">something</p>
$("#test").hasAttr("class")

возвращает истину.

Работает с Camelcase тоже.

Shoter
источник
0

Чтобы выбрать элементы, имеющие определенный атрибут, см. Ответы выше.

Чтобы определить, имеет ли данный элемент jQuery определенный атрибут, я использую небольшой плагин, который возвращает, trueесли первый элемент в коллекции ajQuery имеет этот атрибут:

/** hasAttr
 ** helper plugin returning boolean if the first element of the collection has a certain attribute
 **/
$.fn.hasAttr = function(attr) {
   return 0 < this.length
       && 'undefined' !== typeof attr
       && undefined !== attr
       && this[0].hasAttribute(attr)
}
ErnestV
источник
-5

JQuery вернет атрибут в виде строки. Поэтому вы можете проверить длину этой строки, чтобы определить, установлена ​​ли она:

if ($("input#A").attr("myattr").length == 0)
 return null;
else
 return $("input#A").attr("myattr");
Zach
источник
Итак, я знаю, что прошло больше года, и я должен был решить это давно. Мне интересно, какая часть не работает? Если бы я знал, что вы просто пытаетесь выбрать их, я бы не дал приведенный выше код. Я думал, что вы хотели проверить их по отдельности. JQuery действительно возвращает атрибут в виде строки, и вы можете проверить длину этой строки, как и любую другую строку. Поэтому, пока ваш селектор и атрибут были правильными, вы должны были иметь возможность проверить, имеет ли конкретный вход этот атрибут. Во всяком случае, я просто не хотел, чтобы люди игнорировали принцип, потому что он работает.
Зак
6
он потерпит неудачу в том случае, если атрибут отсутствует, и в этом случае $ ("input # A"). attr ("myattr") вернет undefined вместо строки, а undefined.length завершится ошибкой
Rune FS
Обнаруживает только пустой атрибут по сравнению с атрибутом с содержимым, происходит сбой на несуществующем атрибуте. Первоначальный вопрос был об обнаружении существования атрибута, что делает его неудачным как ответ на вопрос.
Джимбо Джонни