querySelector, corrispondenza elemento jolly?


134

C'è un modo per far corrispondere un nome di elemento jolly usando querySelectoro querySelectorAll? Vedo il supporto per i caratteri jolly nelle query sugli attributi, ma non per gli elementi stessi.

Il documento XML che sto cercando di analizzare è fondamentalmente un elenco semplice di proprietà e ho bisogno di trovare elementi che abbiano determinate stringhe nei loro nomi.

Mi rendo conto che il documento XML probabilmente ha bisogno di una ristrutturazione se ne ho bisogno, ma questo non accadrà.

È accettabile qualsiasi soluzione, tranne tornare all'utilizzo di XPath apparentemente deprecato (IE9 lo ha rilasciato).


Per "nome" intendi il nome del tag?
kennytm,

1
La risposta di @ JaredMcAteer è molto degna di essere accettata come risposta. Si prega di prendere in considerazione.
RBT,

Risposte:


348

[id^='someId']corrisponderà a tutti gli ID che iniziano con someId.

[id$='someId']corrisponderà a tutti gli ID che terminano con someId.

[id*='someId']corrisponderà a tutti gli ID contenenti someId.

Se stai cercando l' nameattributo, sostituiscilo idcon name.

Se stai parlando del nome del tag dell'elemento, non credo che ci sia un modo per usarlo querySelector


4
Grazie, intendevo il nome del tag.
Erik Andersson,

hmm Non posso fare document.querySelectorAll ("div. [id $ = 'foo']")
SuperUberDuper

4
Probabilmente il periodo in cui è in corso document.querySelectorAll("div[id$='foo']")IE8 ha solo un supporto QSA parziale, penso che supportino solo i selettori CSS2.1, quindi questi selettori non funzioneranno in IE8, ma IE9 + funzionerà.
JaredMcAteer,

Questa risposta mi ha salvato la vita! Grazie!!
Menas,

28

Stavo scherzando / meditando su one-liner che coinvolge querySelector () e sono finito qui, e ho avuto una possibile risposta alla domanda OP usando i nomi dei tag e querySelector (), con crediti a @JaredMcAteer per aver risposto alla mia domanda, ovvero con RegEx-like corrisponde a querySelector () in Javascript vaniglia

Sperando che quanto segue sia utile e adatto alle esigenze del PO o di tutti gli altri:

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

Quindi, ad esempio, possiamo ottenere le cose SRC, ecc ...

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

12

Imposta tagName come attributo esplicito:

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

Ne avevo bisogno anch'io, per un documento XML, con i tag nidificati che terminavano _Sequence. Vedi la risposta di JaredMcAteer per maggiori dettagli.

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

Non ho detto che sarebbe carino :) PS: consiglierei di usare tag_namesu tagName, quindi non ti imbatterai in interferenze durante la lettura di attributi DOM impliciti generati dal computer.


8

Ho appena scritto questa breve sceneggiatura; sembra funzionare.

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

L'oggetto restituito da querySelectorAll non supporta necessariamente il filtro su tutti i browser (poiché non è sempre un normale array javascript). Assicurati di controllare questa affermazione in produzione, prima di generare lo script (se lo script viene generato in modo dinamico) o usando le istruzioni condition.
Dmitry,

Risposta molto bella ... Questa è stata la partita conclusiva che ho riscontrato al mio problema. Sto lavorando con elementi personalizzati e funzionalità come questa sono ancora lavori manuali, purtroppo.
codepleb

-1

C'è un modo dicendo ciò che non lo è. Basta fare il non qualcosa che non sarà mai. Un buon riferimento al selettore CSS: https://www.w3schools.com/cssref/css_selectors.asp che mostra il selettore: not come segue:

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

Ecco un esempio: un div seguito da qualcosa (tutt'altro che tag az)

div > :not(z){
 border:1px solid pink;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.