Le Selectors API hanno aggiunto due nuovi metodi all'arsenale DOM di JavaScript: querySelector()
e querySelectorAll()
. Questi due nuovi metodi dell'oggetto document
consentono di selezionare elementi usando un'espressione CSS come argomento. La differenza tra i due metodi è che il primo restituisce un solo elemento mentre il secondo seleziona una collezione di elementi. Vediamo alcuni esempi.
querySelector()
La soluzione più ovvia è quella di passare un selettore di ID a questo metodo:
var elemento = document.querySelector('#test');
Come si può notare, l'espressione CSS ha la stessa sintassi di un qualsiasi selettore CSS. Possiamo tuttavia usare altre espressioni che restituiscano un riferimento univoco ad un elemento:
var elemento = document.querySelector('#test p:first-child');
In questo caso viene selezionato il primo paragrafo di una struttura DOM come la seguente:
<div id="test">
<p>...</p>
<p>...</p>
</div>
Quando accediamo ad un elemento con questi metodi, possiamo usare tutti i metodi e le proprietà DOM associati all'elemento o agli elementi:
alert(elemento.firstChild.nodeValue);
querySelectorAll()
Questo metodo restituisce una collezione di elementi. Per esempio:
var paragrafi = document.querySelectorAll('#test p');
Da cui consegue che è possibile operare un ciclo sui paragrafi:
for(var i = 0; i < paragrafi.length; i += 1) {
var testo = paragrafi[i].firstChild.nodeValue;
alert(testo);
}
Il risultato è del tutto simile a quello che potremmo ottenere con il metodo getElementsByTagName()
ma con un'importante differenza: con questo nuovo metodo possiamo operare su elementi arbitrari aventi anche attributi, non solo su singole tipologie di elementi:
var titled = document.querySelectorAll('a[title]');
In questo caso abbiamo selezionato tutti gli elementi a
aventi un'attributo title
impostato. Con getElementsByTagName()
avremmo invece dovuto scrivere:
var links = document.getElementsByTagName('a');
var titled = [];
for(var i = 0; i < links.length; i += 1) {
var link = links[i];
if(link.hasAttribute('title')) {
titled.push(link);
}
}
Interazione con documenti XML
Alcuni selettori CSS non funzioneranno con i documenti XML. Dato che i selettori di classe e di ID hanno bisogno di una DTD di riferimento per poter funzionare e dato che XML non ha una DTD predefinita, questi selettori non funzioneranno. Ci sono due soluzioni:
- usare i selettori di attributo o i selettori contestuali
- specificare un namespace XHTML sul documento XML in uso:
<?xml version="1.0" encoding="UTF-8"?> <root xmlns="http://www.w3.org/1999/xhtml"> ... </root>
La seconda soluzione farà in modo che i browser utilizzino la DTD predefinita di XHTML, permettendo così di usare i selettori di classe e di ID.
Supporto dei browser
Tutti i browser supportano le Selectors API. Internet Explorer le supporta dalla versione 8 in poi.