Wie kann ein Wildcard-Elementname mit „querySelector()“ oder „querySelectorAll()“ in JavaScript abgeglichen werden?
Lesezeit: 7 Minuten
Erik Andersson
Gibt es eine Möglichkeit, einen Wildcard-Elementnamensabgleich mit durchzuführen? querySelector oder querySelectorAll?
Das XML-Dokument, das ich zu analysieren versuche, ist im Grunde eine flache Liste von Eigenschaften
Ich muss Elemente finden, deren Namen bestimmte Zeichenfolgen enthalten.
Ich sehe Unterstützung für Platzhalter in Attributabfragen, aber nicht für die Elemente selbst.
Jede Lösung außer der Rückkehr zur Verwendung des scheinbar veralteten XPath (IE9 hat ihn eingestellt) ist akzeptabel.
Mit „Name“ meinen Sie den Tag-Namen?
– kennytm
3. Januar 2012 um 15:12
JaredMcAteer
[id^='someId'] stimmt mit allen IDs überein, die mit beginnen someId.
[id$='someId'] stimmt mit allen IDs überein, die mit enden someId.
[id*='someId'] stimmt mit allen enthaltenden IDs überein someId.
Wenn Sie auf der Suche nach dem sind name Attribut einfach ersetzen id mit name.
Wenn Sie über den Tag-Namen des Elements sprechen, glaube ich nicht, dass es eine Möglichkeit gibt, ihn zu verwenden querySelector
Danke, ich meinte den Tag-Namen.
– Erik Andersson
3. Januar 2012 um 15:32
hmm, ich kann document.querySelectorAll(“div.[id$=’foo’]”)
– SuperUberDuper
11. Februar 2016 um 15:56
Der Punkt da drin bringt es wahrscheinlich durcheinander document.querySelectorAll("div[id$='foo']") IE8 bietet nur teilweise QSA-Unterstützung. Ich glaube, sie unterstützen nur CSS2.1-Selektoren, sodass diese Selektoren in IE8 nicht funktionieren, IE9+ jedoch.
– JaredMcAteer
11. Februar 2016 um 20:22
Ich frage mich, warum die API nicht näher am Regex-Weg ist, d [id=’^someId’] stimmt mit allen IDs überein, die mit someId beginnen. Ich bin mir sicher, dass es einen Grund gibt, aber ich kann nicht herausfinden, warum. Eine Frage ist natürlich, wie man unterscheiden kann, ob die ID tatsächlich ^someId ist. Als grobe Idee wäre es vielleicht so etwas wie [id=^’someId’] dh das Zeichen ^ liegt außerhalb der Zeichenfolge?
Ich habe über Einzeiler mit querySelector() herumgespielt und bin hier gelandet. Ich habe eine mögliche Antwort auf die OP-Frage mithilfe von Tag-Namen und querySelector(), mit Dank an @JaredMcAteer für die Beantwortung MEINER Frage, auch bekannt als RegEx-like stimmt mit querySelector() in Vanilla Javascript überein
Ich hoffe, dass das Folgende nützlich ist und den Bedürfnissen des OP oder allen anderen entspricht:
// 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"]');
Dann können wir zum Beispiel das src-Zeug usw. besorgen …
Vielen Dank: document.querySelectorAll(“a[href*=’adamt.nl/product’]”); Hat bei mir auch funktioniert (also href anstelle von src verwenden). Alhamdulillah!
Ich habe nicht gesagt, dass es hübsch wäre 🙂 PS: Ich würde es empfehlen tag_name über tagName, damit es beim Lesen von „computergenerierten“, impliziten DOM-Attributen nicht zu Störungen kommt.
cruzanmo
Ich habe gerade dieses kurze Skript geschrieben; scheint zu funktionieren.
/**
* 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"
Viele der Antworten oben gefielen mir, aber ich bevorzuge, dass meine Abfragen nur für Klassen/IDs ausgeführt werden, damit sie nicht jedes Element durchlaufen müssen. Dies ist eine Kombination aus Code von @bigiCrab und @JaredMcAteer
// class exactly matches abc
const exactAbc = document.querySelectorAll("[class="abc"]")
// class begins with abc
const startsAbc = document.querySelectorAll("[class^='abc']")
// class contains abc
const containsAbc = document.querySelectorAll("[class*='abc']")
// class contains white-space separated word exactly matching abc
const wordAbc = document.querySelectorAll("[class~='abc']")
// class ends with abc
const endsAbc = document.querySelectorAll("[class$='abc']")
Ersetzen Sie „class“ durch „id“ oder „href“, um andere Übereinstimmungen zu erhalten. Weitere Beispiele finden Sie im unten verlinkten Artikel.
document.querySelectorAll('input:not([name="my last name"])');
// "my-first-name"
Und Sie können sagen form#my-form vor input[name^="my"] zur Auswahl <input>Genauer gesagt logisches UND (&&) Wie nachfolgend dargestellt:
document.querySelectorAll('form#my-form input[name^="my"]');
// "my-first-name" and "my last name"
Und das können Sie auch input:not([name^="last"]):not([name*="st"][value="Smith"]) zur Auswahl <input>Genauer gesagt logisches UND (&&) Wie nachfolgend dargestellt:
document.querySelectorAll('input:not([name^="my-"]):not([name*="st"][value="John"])');
// "my last name"
Und das können Sie auch input[name*="first"], input[name="my last name"] zur Auswahl <input>Genauer gesagt logisches ODER (||) Wie nachfolgend dargestellt:
document.querySelectorAll('input[name*="first"], input[name="my last name"]')
// "my-first-name" and "my last name"
14546200cookie-checkWie kann ein Wildcard-Elementname mit „querySelector()“ oder „querySelectorAll()“ in JavaScript abgeglichen werden?yes
Mit „Name“ meinen Sie den Tag-Namen?
– kennytm
3. Januar 2012 um 15:12