Виберіть елементи за атрибутом


253

У мене є колекція прапорців із згенерованими ідентифікаторами, а деякі з них мають додатковий атрибут. Чи можна за допомогою JQuery перевірити, чи має елемент специфічний атрибут? Наприклад, чи можу я перевірити, чи є наступний елемент атрибутом "myattr"? Значення атрибута може змінюватися.

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

Наприклад, як я можу отримати колекцію всіх прапорців, які мають цей атрибут, не перевіряючи по черзі? Чи можливо це?


2
Убік <input /> - це порожній тег, який не повинен містити вміст всередині нього. Можливо, ви не переймаєтесь підтвердженням бачення, коли у вас присутній міаттр ...
ScottE


Якщо у вас вже є колекція і ви хочете відфільтрувати лише елементи з певним атрибутом - просто зробіть це -$filtered = $collection.filter('[attribute_name]');
jave.web

Відповіді:


190

Ви маєте на увазі, чи можете ви їх вибрати? Якщо так, то так:

$(":checkbox[myattr]")

4
Зауважте, що якщо ви тестуєте наявність (наприклад, у заяві if, наприклад), це, мабуть, правильніше / надійніше зробити: if ($ (": checkbox [myattr]"). Length ()> 0) ...
rinogo

14
@rinogo: насправді все, що вам потрібно, це if ($ (": checkbox [myattr]"). length). Довжина () після довжини не потрібна, а також> 0, 0 не оцінюється як хибна в тестах рівності, які не вимагають суворої рівності (як значення, так і типу).
bmarti44

1
Він викидає js помилки, якщо ви спробуєте щось на кшталт: td [myattr]. Тому я думаю, що ця функція спеціально націлена на прапорці.
дурилиприблизи

6
Товста кишка вибирає псевдокласи, що визначаються типом attr. Щоб застосувати те ж саме до td, просто опустіть товсту кишку.
dhochee

Або якщо ви хотіли дізнатись, чи не було такого атрибуту, як, наприклад, знайти всі посилання, які не мають hrefатрибутів. $("#myBox").find('a').filter(':not([href])')
timbrown

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 = ''
mythicalprogrammer

3
@mhenry - тоді ви помилитесь :) Якщо ви будували проект для мене або поряд зі мною, я б вимагав, щоб ви виправили свою помилку. Якби це пакет з відкритим кодом, я (разом із багатьма користувачами) припинив би його використовувати виходячи з того, що він погано зашифрований. Якби ви не змінили його, то хтось інший, зрештою, роздробляє версію без помилки, і люди скористаються нею, а ви втратите власний проект, як це було багато разів, коли хтось створював пакунок, і це гарна ідея погана реалізація. Так чи інакше, ви навчили б вас урок про практику кодування :)
Jimbo Jonny

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');


@RetroCoder, що ти думаєш про своє посилання? Цей тест здається непоганим, тим більше, що часто ви користуєтесь $(this).<something>тут, коли можете робити this.hasAttribute('...')безпосередньо (і, звичайно, не цікавити старі браузери)
Alexis Wilke

8

У JavaScript ...

null == undefined

... повертається true*. Це різниця між ==і ===. Також ім'я undefinedможна визначити (це не ключове слово, як nullє), тому вам краще перевірити інший спосіб. Найбільш надійний спосіб - це, мабуть, порівняння зворотного значення typeofоператора.

typeof o == "undefined"

Тим не менш, порівняння з null повинно працювати в цьому випадку.

* Припустимо undefined, що насправді не визначено.


Undefined не є зарезервованим ключовим словом у JavaScript. У jQuery можливо змінити його ім'я саме тому, що воно побудовано за допомогою кондуктора "var" і не оцінюється. У верхній частині коду магічної бібліотеки, infact, є рядок, який зазначає "var undefined;" і таким чином визначається невизначена змінна з цим ім'ям в області jQuery ... Але це все одно можна було б назвати "без назви", ввівши "var unnamed;"
Емануель Дель Гранде

1
Це не перевірка на атрибут, це перевірка властивості в об'єкті JavaScript, чому це 6 оновлень?
ncubica

5

$("input[attr]").length може бути кращим варіантом.


4

Пару ідей було викинуто навколо, використовуючи "typeof", jQuery ".is" та ".filter", тому я подумав, що опублікую їх швидке порівняння. Найкращим вибором для цього є typeof. У той час як інші працюватимуть, очевидно, є чітка різниця в продуктивності при виклику бібліотеки jq для цього зусилля.


2
if (!$("#element").attr('my_attr')){
  //return false
  //attribute doesn't exists
}

1
це, ймовірно, не буде працювати, оскільки ви можете додати атрибут без значення. у такому випадку ця умова пройде, хоча бажаною поведінкою може бути повернення істини, атрибут встановлюється. схожі на PHP isset()або, наприклад, у js $("#element").attr('my_attr') === false,
ulkas

2

як у цій публікації , використовуючи .isі селектор атрибутів [], ви можете легко додати функцію (або прототип):

function hasAttr($sel,attr) {
    return $sel.is('['+attr+']');
}

1
$("input#A").attr("myattr") == null

1
$ (). attr () не поверне null, як запропоновано в нашому прикладі, натомість повернеться невизначеним.
Стефан Гегріг

Для мене працює в firebug, але це може бути річ пожежі
Mathias F

Не пробував, але про це пише документація: docs.jquery.com/Attributes/attr#name
Стефан

1

просто:

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

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


1
Нескладені подвійні лапки в рядку, визначеному подвійними лапками, не є дійсним рядком. На жаль, я не можу відредагувати його для вас, оскільки редакція повинна змінити 6 символів або більше, але її потрібно змінити.
Jimbo Jonny

0

На додаток до вибору всіх елементів з атрибутом $('[someAttribute]')або $('input[someAttribute]')ви також можете використовувати функцію для здійснення булевих перевірок на об'єкт, такий як у обробці кліків:

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


0

Я створив пакет npm із призначеною поведінкою, як описано вище в питанні.

Посилання на [npm] та [github]

Використання дуже просте. Наприклад:

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

повертає правду.

Працює і з верблюдом.


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)
}

-5

JQuery поверне атрибут у вигляді рядка. Тому ви можете перевірити довжину цього рядка, щоб визначити, чи встановлено:

if ($("input#A").attr("myattr").length == 0)
 return null;
else
 return $("input#A").attr("myattr");

Отже, я знаю, що минуло вже рік, і я мав би давно вирішити це. Мені цікаво, яка частина не працювала? Якби я знав, що ти просто намагаєшся їх вибрати, я б не вказав наведений вище код. Я думав, ти хочеш перевірити їх окремо. Насправді JQuery повертає атрибут у вигляді рядка, і ви можете перевірити довжину цього рядка так само, як і будь-який інший рядок. Отже, поки ваш селектор та атрибут були правильними, ви мали би змогу перевірити, чи є у конкретного вводу цей атрибут. У всякому разі, я просто не хотів, щоб люди знижували цей принцип, бо він працює.
зач

6
не вдасться в тому випадку, коли атрибут відсутній, в цьому випадку $ ("input # A"). attr ("myattr") повертається невизначеним, а не рядком, і undefined.length не вдасться
Rune FS

Виявляє лише порожній атрибут порівняно з одним із вмістом, не працює на неіснуючому атрибуті. Початкове запитання стосувалося виявлення існування атрибута, що робило це невдачею як відповіддю на запитання.
Jimbo Jonny
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.