querySelector, coincidencia de elementos comodín?


133

¿Hay alguna manera de hacer coincidir el nombre de un elemento comodín con querySelectoro querySelectorAll? Veo soporte para comodines en las consultas de atributos, pero no para los elementos en sí.

El documento XML que intento analizar es básicamente una lista plana de propiedades y necesito encontrar elementos que tengan ciertas cadenas en sus nombres.

Me doy cuenta de que el documento XML probablemente necesite una reestructuración si lo necesito, pero eso simplemente no va a suceder.

Cualquier solución, excepto volver a usar el XPath aparentemente obsoleto (IE9 lo dejó caer) es aceptable.


Por "nombre" te refieres al nombre de la etiqueta?
kennytm

1
La respuesta de @ JaredMcAteer es muy digna de ser aceptada como respuesta. Por favor considera.
RBT

Respuestas:


347

[id^='someId']coincidirá con todos los identificadores que comiencen por someId.

[id$='someId']coincidirá con todos los identificadores que terminen en someId.

[id*='someId']coincidirá con todos los identificadores que contengan someId.

Si está buscando el nameatributo, simplemente sustitúyalo idpor name.

Si está hablando del nombre de la etiqueta del elemento, no creo que haya una manera de usar querySelector


44
Gracias, me refería al nombre de la etiqueta.
Erik Andersson

hmm no puedo hacer document.querySelectorAll ("div. [id $ = 'foo']")
SuperUberDuper

44
El período allí probablemente lo está arruinando. document.querySelectorAll("div[id$='foo']")IE8 solo tiene soporte QSA parcial, creo que solo admiten selectores CSS2.1, por lo que estos selectores no funcionarán en IE8, pero IE9 + funcionará.
JaredMcAteer

¡Esta respuesta me salvó la vida! ¡¡Gracias!!
Menas

28

Estaba jugando / reflexionando en frases que incluyen querySelector () y terminé aquí, y tengo una posible respuesta a la pregunta OP usando nombres de etiqueta y querySelector (), con créditos a @JaredMcAteer por responder MI pregunta, también conocido como RegEx-like coincide con querySelector () en Javascript vainilla

Esperando que lo siguiente sea útil y se ajuste a las necesidades del OP o de los demás:

// 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"]');

Entonces, podemos, por ejemplo, obtener el material src, etc.

console.log(youtubeDiv.src);
//> "http://www.youtube.com/embed/Jk5lTqQzoKA"
console.debug(youtubeDiv);
//> (...)

12

Establezca el tagName como un atributo explícito:

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

Yo mismo necesitaba esto, para un documento XML, con etiquetas anidadas que terminaban en _Sequence. Consulte la respuesta de JaredMcAteer para obtener más detalles.

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

No dije que sería bonito :) PD: recomendaría usar tag_nameover tagName, para que no te encuentres con interferencias cuando leas atributos DOM implícitos 'generados por computadora'.


8

Acabo de escribir este breve guión; parece funcionar.

/**
 * 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"

El objeto devuelto por querySelectorAll no necesariamente admite el filtro en todos los navegadores (ya que no siempre es una matriz de JavaScript normal). Asegúrese de verificar esta afirmación en la producción, ya sea antes de que se genere el script (si el script se genera dinámicamente), o usando declaraciones de condición.
Dmitry

Muy buena respuesta ... Esta fue la coincidencia de cierre que encontré con mi problema. Estoy trabajando con elementos personalizados y características como esta todavía son trabajos manuales, lamentablemente.
codepleb

-1

Hay una manera de decir lo que no es. Simplemente haga que el no sea algo que nunca será. Una buena referencia de selector de CSS: https://www.w3schools.com/cssref/css_selectors.asp que muestra: no selector de la siguiente manera:

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

Aquí hay un ejemplo: un div seguido de algo (cualquier cosa menos una etiqueta az)

div > :not(z){
 border:1px solid pink;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.