querySelector, dopasowanie elementu wieloznacznego?

144

Czy istnieje sposób na dopasowanie nazwy elementu wieloznacznego za pomocą querySelectorlub querySelectorAll? Widzę obsługę symboli wieloznacznych w zapytaniach o atrybuty, ale nie dla samych elementów.

Dokument XML, który próbuję przeanalizować, to w zasadzie płaska lista właściwości i muszę znaleźć elementy, które mają określone ciągi w swoich nazwach.

Zdaję sobie sprawę, że dokument XML prawdopodobnie wymaga restrukturyzacji, jeśli tego potrzebuję, ale tak się nie stanie.

Każde rozwiązanie poza powrotem do używania najwyraźniej przestarzałego XPath (IE9 go porzuciło) jest dopuszczalne.

Erik Andersson
źródło
Przez „nazwę” masz na myśli nazwę tagu?
kennytm
1
Odpowiedź @ JaredMcAteer jest warta akceptacji jako odpowiedź. Proszę wziąć pod uwagę.
RBT

Odpowiedzi:

371

[id^='someId']dopasuje wszystkie identyfikatory zaczynające się od someId.

[id$='someId']dopasuje wszystkie identyfikatory kończące się na someId.

[id*='someId']dopasuje wszystkie identyfikatory zawierające someId.

Jeśli szukasz nameatrybutu, zastąp idgo name.

Jeśli mówisz o nazwie tagu elementu, nie sądzę, aby można było użyć querySelector

JaredMcAteer
źródło
4
Dzięki, miałem na myśli nazwę tagu.
Erik Andersson,
hmm Nie mogę zrobić document.querySelectorAll ("div. [id $ = 'foo']")
SuperUberDuper
4
Okres, w którym to prawdopodobnie psuje, document.querySelectorAll("div[id$='foo']")IE8 ma tylko częściową obsługę QSA, myślę, że obsługują tylko selektory CSS2.1, więc te selektory nie będą działać w IE8, ale IE9 + będzie działać.
JaredMcAteer
Ta odpowiedź uratowała mi życie! Dziękuję Ci!!
Menas
31

Robiłem zamieszanie / zastanawiałem się nad tekstami jednowierszowymi związanymi z querySelector () i skończyłem tutaj, i mam możliwą odpowiedź na pytanie OP za pomocą nazw tagów i querySelector (), z kredytami dla @JaredMcAteer za odpowiedź na MOJE pytanie, aka mają podobne do RegEx pasuje do querySelector () w zwykłym JavaScript

Mając nadzieję, że poniższe elementy okażą się przydatne i będą pasować do potrzeb OP lub wszystkich innych:

// basically, of before:
var youtubeDiv = document.querySelector('iframe[src="http://www.youtube.com/embed/Jk5lTqQzoKA"]')

// after     
var youtubeDiv = document.querySelector('iframe[src^="http://www.youtube.com"]');
// or even, for my needs
var youtubeDiv = document.querySelector('iframe[src*="youtube"]');

Następnie możemy na przykład pobrać zawartość src itp.

console.log(youtubeDiv.src);
//> "http://www.youtube.com/embed/Jk5lTqQzoKA"
console.debug(youtubeDiv);
//> (...)
StephaneAG
źródło
13

Ustaw tagName jako jawny atrybut:

for(var i=0,els=document.querySelectorAll('*'); i<els.length;
          els[i].setAttribute('tagName',els[i++].tagName) );

Sam potrzebowałem tego dla dokumentu XML z zagnieżdżonymi tagami kończącymi się na _Sequence. Zobacz odpowiedź JaredMcAteer, aby uzyskać więcej informacji.

document.querySelectorAll('[tagName$="_Sequence"]')

Nie powiedziałem, że to będzie ładne :) PS: Polecam użycie tag_nameover tagName, abyś nie wpadał w interferencje podczas czytania „wygenerowanych przez komputer”, niejawnych atrybutów DOM.

Lorenz Lo Sauer
źródło
7

Właśnie napisałem ten krótki scenariusz; wydaje się działać.

/**
 * Find all the elements with a tagName that matches.
 * @param {RegExp} regEx  regular expression to match against tagName
 * @returns {Array}       elements in the DOM that match
 */
function getAllTagMatches(regEx) {
  return Array.prototype.slice.call(document.querySelectorAll('*')).filter(function (el) { 
    return el.tagName.match(regEx);
  });
}
getAllTagMatches(/^di/i); // Returns an array of all elements that begin with "di", eg "div"
cruzanmo
źródło
obiekt zwracany przez querySelectorAll niekoniecznie obsługuje filtrowanie we wszystkich przeglądarkach (ponieważ nie zawsze jest to zwykła tablica javascript). Pamiętaj, aby sprawdzić to potwierdzenie w środowisku produkcyjnym, przed wygenerowaniem skryptu (jeśli skrypt jest generowany dynamicznie) lub przy użyciu instrukcji warunkowych.
Dmitry
Bardzo dobra odpowiedź ... To było dopasowanie zamknięcia do mojego problemu. Pracuję z niestandardowymi elementami, a funkcje takie jak ta to niestety nadal praca ręczna.
Codepleb
To będzie zabójca wydajności.
koleś
-1

Jest sposób, aby powiedzieć, co nie jest. Po prostu spraw, aby nie było czymś, czym nigdy nie będzie. Dobre odniesienie do selektora css: https://www.w3schools.com/cssref/css_selectors.asp, które pokazuje: not selector w następujący sposób:

:not(selector)  :not(p) Selects every element that is not a <p> element

Oto przykład: element div, po którym następuje coś (cokolwiek oprócz znacznika az)

div > :not(z){
 border:1px solid pink;
}
Steve Lloyd
źródło