Znajdź element w DOM na podstawie wartości atrybutu


252

Czy możesz mi powiedzieć, czy istnieje interfejs API DOM, który szuka elementu o podanej nazwie atrybutu i wartości atrybutu:

Coś jak:

doc.findElementByAttribute("myAttribute", "aValue");

1
Zduplikuj, jeśli szukasz Jquery Sol: stackoverflow.com/questions/696968/…
Rajat

13
Czy możesz zaktualizować przyjętą odpowiedź na nowoczesne rozwiązanie, odpowiedź Wojtka?
Nick Craver

Odpowiedzi:


165

Aktualizacja: W ciągu ostatnich kilku lat krajobraz zmienił się drastycznie. Możesz teraz niezawodnie korzystać querySelectori querySelectorAllzobacz odpowiedź Wojtka, jak to zrobić.

Nie ma teraz potrzeby korzystania z zależności jQuery. Jeśli używasz jQuery, świetnie ... jeśli nie, nie musisz już polegać na samym wybieraniu elementów według atrybutów.


Nie jest to bardzo krótki sposób na zrobienie tego w waniliowym javascript, ale jest kilka dostępnych rozwiązań.

Robisz coś takiego, przeglądając elementy i sprawdzając atrybut

Jeśli biblioteka taka jak jQuery jest opcją, możesz to zrobić trochę łatwiej, na przykład:

$("[myAttribute=value]")

Jeśli wartość nie jest prawidłowym identyfikatorem CSS (zawiera spacje lub znaki interpunkcyjne itp.), Musisz wstawić cudzysłowy wokół wartości (mogą być pojedyncze lub podwójne):

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

Można również zrobić start-with, ends-with, contains, itd ... istnieje kilka opcji dla selektora atrybutu .


6
W rzeczywistości waniliowy JavaScript DOM API działa całkiem dobrze na nowoczesnych przeglądarkach
Wojtek Kruszewski

2
@WojtekKruszewski nie w 2010 roku :) Zaktualizowałem jednak, mam nadzieję, że pytający przeniesie dla nas akceptację - chcemy tam znaleźć aktualne informacje.
Nick Craver

1
Myślę, że jQuery (lub odpowiednik) jest prawdopodobnie najłatwiejszy, szczególnie w przypadku kompatybilności z wieloma przeglądarkami bez konieczności posiadania wiedzy na temat tego.
Alexis Wilke,

1
Dostaję pustą tablicę! Próbuję pobrać plik SVG według jego atrybutu d i próbuję $ ("[d = ścieżka]"); gdzie „ścieżka” jest zmienną zawierającą konkretny atrybut d, którego potrzebuję. Czy ktoś próbował to zrobić ze ścieżkami SVG?
tx291,

437

Nowoczesne przeglądarki obsługują natywne, querySelectorAlldzięki czemu możesz:

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

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

Szczegóły dotyczące zgodności przeglądarki:

Możesz użyć jQuery do obsługi przestarzałych przeglądarek (IE9 i starszych):

$('[data-foo="value"]');

2
w celu skonkretyzowania „nowoczesnej” definicji: caniuse.com/#search=querySelectorAll
serhio

Wydaje się, że wartość nie może być liczbą lubSyntaxError: An invalid or illegal string was specified
jeum

3
Selektor powinien być:'[data-foo="value"]'
Yotam Omer

1
Jakieś uwagi na temat wykonania? Czy to jest szybsze niż iteracja po wszystkich węzłach?
Stepan Yakovenko

1
Co to jest „data-foo” ... i gdzie w tym przykładzie poszło „myAttribute”?
oo_dev

38

Możemy użyć selektora atrybutów w DOM przy użyciu document.querySelector()i document.querySelectorAll()metod.

dla twoich:

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

i za pomocą querySlectorAll():

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

W querySelector()i querySelectorAll()metodach możemy wybierać obiekty tak, jak wybieramy w „CSS”.

Więcej informacji o selektorach atrybutów „CSS” w https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors


Musiałem usunąć wewnętrzne znaki cudzysłowu, takie jak ten document.querySelectorAll ("selector [myAttribute = aValue]");
Matjaz Hirsman

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

ps, jeśli znasz dokładny typ elementu, dodajesz trzeci parametr (tj. div, a, p ...etc...):

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

ale najpierw zdefiniuj tę funkcję:

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 zaktualizowane według rekomendacji komentarzy.


6
Czemu ?! Robiąc to, zapętlasz cały swój DOM
Arthur,

3
To wydaje się świetne - jeśli masz tylko 5 elementów na stronie.
sheriffderek

2
document.querySelectorAll('[data-foo="value"]');zgodnie z propozycją @Wojtek Kruszewski na temat zaakceptowanej awnsera.
Arthur

7

Oto przykład, jak wyszukiwać obrazy w dokumencie według atrybutu src:

document.querySelectorAll("img[src='https://pbs.twimg.com/profile_images/........jpg']");


0

Użyj selektorów zapytań, przykłady:

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

input[name] Wprowadza elementy za pomocą name właściwością.

[id|=view] Elementy o identyfikatorze zaczynające się od view- .

[class~=button]Elementy z buttonklasą.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.