Como vimos anteriormente, los elementos HTML tienen que ser referenciados desde Javascript para ser afectados por el código. Si recuerdas de previos capítulos, CSS, y especialmente CSS3, ofrece un poderoso sistema de referencia y selección que no  tiene comparación con los pocos métodos provistos por Javascript para este propósito.  Los métodos getElementById, getElementsByTagName y getElementsByClassName no son suficientes para contribuir a la integración que este lenguaje necesita y sostener la relevancia que posee dentro de la especificación de HTML5. Para elevar Javascript al nivel que las circunstancias requieren, nuevas alternativas debieron ser incorporadas. Desde ahora podemos seleccionar elementos HTML aplicando toda clase de selectores CSS por medio de los nuevos métodos  querySelector() y querySelectorAll().

querySelector()

Este método retorna el primer elemento que concuerda con el grupo de selectores especificados entre paréntesis. Los selectores son declarados usando comillas y la  misma sintaxis CSS, como en el siguiente ejemplo:

Ejm 4.4

function hacerclic()
{
document.querySelector(“#principal p:firstchild”)
.onclick=mostraralerta;
}

function mostraralerta()
{
alert('hizo clic!');
}

window.onload=hacerclic;

En el ejm 4.4, el método getElementsByTagName usado anteriormente ha sido reemplazado por querySelector(). Los selectores para esta consulta en particular están referenciando al primer elemento <p> que es hijo del elemento identificado con el atributo id y el valor main.

Debido a que ya explicamos que este método solo retorna el primer elemento encontrado, probablemente observarás que la pseudo clase first-child es redundante. El método querySelector() en nuestro ejemplo retornará el primer elemento <p> dentro de <div> que es, por supuesto, su primer hijo. El propósito de este ejemplo es  mostrarle que querySelector() acepta toda clase de selectores válidos CSS y ahora, del  mismo modo que en CSS, Javascript también provee herramientas importantes para  referenciar cada elemento en el documento.

Varios grupos de selectores pueden ser declarados separados por coma. El método
querySelector() retornará el primer elemento que concuerde con cualquiera de ellos.

querySelectorAll()

En lugar de uno, el método querySelectorAll() retorna todos los elementos que concuerdan con el grupo de selectores declarados entre paréntesis. El valor retornado  es un array conteniendo cada elemento encontrado en el orden en el que  aparecen en el documento.

Ejm 4.5

function hacerclic()
{
var lista=document.querySelectorAll(“#principal p”);
lista[0].onclick=mostraralerta;
}

function mostraralerta()
{
alert('hizo clic!');
}

window.onload=hacerclic;

El grupo de selectores especificados en el método querySelectorAll() del ejm 4.5 encontrará cada elemento <p> en el documento HTML del ejm 4.3 que es hijo del elemento <div>. Luego de la ejecución de esta primera línea, el array lista tendrá dos valores: una referencia al primer elemento <p> y una referencia al segundo elemento <p>. Debido a que el índice de cada array comienza por 0, en la próxima línea el  primer elemento encontrado es referenciado usando corchetes y el valor 0 (lista[0]).

Para interactuar con una lista de elementos retornados por este método, podemos utilizar un bucle for:

Ejm 4.6

function hacerclic()
{
var lista=document.querySelectorAll(“#principal p”);
for(var f=0; f<lista.length; f++)
{
lista[f].onclick=mostraralerta;
}
}

function mostraralerta()
{
alert('hizo clic!');
}
window.onload=hacerclic;

En el ejm 4.6, en lugar de seleccionar solo el primer elemento encontrado, registramos el manejador de eventos onclick para cada uno de ellos usando un bucle for. Ahora, todos los elementos <p> dentro de <div> mostrarán una pequeña ventana cuando el usuario haga clic sobre ellos.

El método querySelectorAll(), al igual que querySelector(), puede contener uno o más grupos de selectores separados por coma. Éstos y los demás métodos estudiados pueden ser combinados para referenciar elementos a los que resulta difícil llegar. Por ejemplo, en el próximo listado, el mismo resultado del ejm 4.6 es logrado utilizando querySelectorAll() y getElementById() juntos:

Ejm 4.7

function hacerclic()
{
var lista=document.getElementById(‘principal’).
querySelectorAll(“p”);
lista[0].onclick=mostraralerta;
}

function mostraralerta()
{
alert('hizo clic!');
}

window.onload=hacerclic;

Usando esta técnica podemos ver qué precisos pueden ser estos métodos. Podemos combinarlos en una misma línea y luego realizar una segunda selección con otro  método para alcanzar elementos dentro de los primeros. En próximos capítulos estudiaremos algunos ejemplos más.