Найти элемент в DOM на основе значения атрибута

252

Подскажите, пожалуйста, есть ли какой-нибудь DOM API, который ищет элемент с заданным именем атрибута и значением атрибута:

Что-то вроде:

doc.findElementByAttribute("myAttribute", "aValue");
Майкл
источник
1
Дублируйте, если вы ищете Jquery Sol: stackoverflow.com/questions/696968/…
Раджат
13
Не могли бы вы обновить принятый ответ на современное решение, ответ Войтека?
Ник Крейвер

Ответы:

165

Обновление: за последние несколько лет ландшафт резко изменился. Теперь вы можете надежно использовать querySelectorи querySelectorAllсм . Ответ Войтека о том, как это сделать.

Теперь нет необходимости в зависимости от jQuery. Если вы используете jQuery, отлично ... если нет, вам больше не нужно полагаться на него только для выбора элементов по атрибутам.


В ванильном javascript нет очень короткого способа сделать это, но есть несколько доступных решений.

Вы делаете что-то вроде этого, просматривая элементы и проверяя атрибут

Если библиотека типа jQuery является опцией, вы можете сделать это немного проще, например так:

$("[myAttribute=value]")

Если значение не является допустимым идентификатором CSS (в нем есть пробелы или знаки пунктуации и т. Д.), Вам необходимо заключить в кавычки значение (они могут быть одинарными или двойными):

$("[myAttribute='my value']")

Вы можете также сделать start-with, ends-with, containsи т.д. ... Есть несколько вариантов для выбора атрибута .

Ник Крейвер
источник
6
На самом деле ванильный JavaScript DOM API хорошо работает в современных браузерах
Войтек Крушевский
2
@WojtekKruszewski не в 2010 году :) Я обновил, хотя, надеюсь, аскер перенесет принятие для нас - мы хотим, чтобы текущая информация была там.
Ник Крейвер
1
Я думаю, что jQuery (или его эквивалент), вероятно, проще всего, особенно если он совместим с несколькими браузерами, без необходимости знать, что для этого требуется.
Алексис Уилке
1
Я продолжаю получать пустой массив! Я пытаюсь получить SVG по его атрибуту d и пытаюсь $ ("[d = путь]"); где «путь» - это переменная, содержащая нужный мне d-атрибут. Кто-нибудь пробовал делать это с путями SVG?
tx291
439

Современные браузеры поддерживают нативный, querySelectorAllтак что вы можете сделать:

document.querySelectorAll('[data-foo="value"]');

https://developer.mozilla.org/en-US/docs/Web/API/Document.querySelectorAll

Подробная информация о совместимости браузера:

Вы можете использовать jQuery для поддержки устаревших браузеров (IE9 и старше):

$('[data-foo="value"]');
Войтек Крушевский
источник
2
для того чтобы конкретизировать «современное» определение: caniuse.com/#search=querySelectorAll
serhio
Кажется, что значение не может быть числом илиSyntaxError: An invalid or illegal string was specified
jeum
3
Селектор должен быть:'[data-foo="value"]'
Йотам Омер
1
Любые заметки о производительности? Это быстрее, чем итерация по всем узлам?
Степан Яковенко
1
Что такое «data-foo» ... и куда уходит «myAttribute» в этом примере?
oo_dev
38

Мы можем использовать селектор атрибута в DOM, используя document.querySelector()и document.querySelectorAll()методы.

для вас:

document.querySelector("selector[myAttribute='aValue']");

и с помощью querySlectorAll():

document.querySelectorAll("selector[myAttribute='aValue']");

В querySelector()и querySelectorAll()методы мы можем выбрать объекты, как мы выбираем в «CSS».

Подробнее о селекторах атрибутов «CSS» см. Https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors.

Навин Пантра
источник
Мне пришлось удалить внутренние кавычки, как этот document.querySelectorAll ("selector [myAttribute = aValue]");
Матяз Хирсман
20
FindByAttributeValue("Attribute-Name", "Attribute-Value");   

ps если вы знаете точный тип элемента, вы добавляете третий параметр (т.е. div, a, p ...etc...):

FindByAttributeValue("Attribute-Name", "Attribute-Value", "div");   

но сначала определим эту функцию:

function FindByAttributeValue(attribute, value, element_type)    {
  element_type = element_type || "*";
  var All = document.getElementsByTagName(element_type);
  for (var i = 0; i < All.length; i++)       {
    if (All[i].getAttribute(attribute) == value) { return All[i]; }
  }
}

ps обновлено за комментарии рекомендации.

T.Todua
источник
6
Зачем ?! Делая это, вы зацикливаете все свои DOM
Артур
3
Это выглядит замечательно - если у вас есть только 5 элементов на странице.
sheriffderek
2
document.querySelectorAll('[data-foo="value"]');как предложено @Wojtek Kruszewski на принятом awnser.
Артур
7

Вот пример, Как искать изображения в документе по атрибуту src:

document.querySelectorAll("img[src='https://pbs.twimg.com/profile_images/........jpg']");
KhaledDev
источник
0

Используйте селекторы запросов, примеры:

document.querySelectorAll(' input[name], [id|=view], [class~=button] ')

input[name]Вводит элементы со nameсвойством.

[id|=view]Элементы с идентификатором, которые начинаются с view-.

[class~=button]Элементы с buttonклассом.

Даниэль Де Леон
источник