Capitulo 4 Javascript – 2

Capitulo 4 Javascript - 2

4.3    Nuevos Selectores

Como vimos anteriormente, los elementos HTML tienen que ser referenciados desde Javascript para ser afectados por el código. Si recuerda 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 getElementByld, 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:

function hacerclic(){

document.querySelector(«#principal p:first-

child»).onclick=mostraralerta;

}

function mostraralerta(){
alert(‘hizo clic!’);

}

window.onload=hacerclic;

Listado 4-4. Usando querySelector () .

En el Listado 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 notará 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.

Hágalo usted mismo: Reemplace el código en el archivo micodigo.js por el provisto en el Listado 4-4 y abra el archivo HTML con el código del Listado 4-3 en su navegador para ver el método querySelector () en acción.

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 arreglo (array) conteniendo cada elemento encontrado en el orden en el que aparecen en el documento.

function hacerclic(){

var lista=document.querySelectorAll(«#principal p»); lista[0].onclick=mostraralerta;

}

function mostraralerta(){
alert(‘hizo clic!’);

}

window.onload=hacerclic;

Listado 4-5. Usando querySelectorAll ().

El grupo de selectores especificados en el método querySelectorAll () del Listado 4-5 encontrará cada elemento <p> en el documento HTML del listado 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]).

Note que este ejemplo no muestra el potencial de querySelectorAll(). Normalmente será utilizado para afectar a varios elementos y no solo uno, como en este caso. Para interactuar con una lista de elementos retornados por este método, podemos utilizar un bucle for:

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;

Listado 4-6. Afectando todos los elementos encontrados por querySelectorAll ().

En el Listado 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 código del Listado 4-6 es logrado utilizando querySelectorAll () y getElementById () juntos:

function hacerclic(){

var lista=document.getElementById(‘principal’).

querySelectorAll(«p»);

lista[0].onclick=mostraralerta;

}

function mostraralerta(){
alert(‘hizo clic!’);

}

window.onload=hacerclic;

Listado 4-7. Combinando métodos.

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.

4.4    Manejadores de eventos

Como comentamos anteriormente, el código JavaScript es normalmente ejecutado luego de que el usuario realiza alguna acción. Estas acciones y otros eventos son procesados por manejadores de eventos y funciones Javascript asociadas con ellos.

Existen tres diferentes formas de registrar un evento para un elemento HTML: podemos agregar un nuevo atributo al elemento, registrar un manejador de evento como una propiedad del elemento o usar el nuevo método estándar addEventListener ().

Conceptos básicos: En Javascript las acciones de los usuarios son llamadas eventos. Cuando el usuario realiza una acción, como un clic del ratón o la presión de una tecla, un evento específico para cada acción y cada elemento es disparado. Además de los eventos producidos por los usuarios existen también otros eventos disparados por el sistema (por ejemplo, el evento load que se dispara cuando el documento es completamente cargado). Estos eventos son manejados por códigos o funciones. El código que responde al evento es llamado manejador. Cuando registramos un manejador lo que hacemos es definir cómo nuestra aplicación responderá a un evento en particular. Luego de la estandarización del método addEventListener (), este procedimiento es usualmente llamado «escuchar al evento», y lo que hacemos para preparar el código que responderá a ese evento es «agregar una escucha» a un elemento en particular.

Manejadores de eventos en línea

Ya utilizamos esta técnica en el código del Listado 4-1 incluyendo el atributo onclick en el elemento <p> (revise este código para comprobar cómo se aplica). Se trata simplemente de utilizar los atributos provistos por HTML para registrar eventos para un elemento en particular. Esta es una técnica en desuso pero aun extremadamente útil y práctica en algunas circunstancias, especialmente cuando necesitamos hacer modificaciones rápidas para testeo.

Manejadores de eventos como propiedades

Para evitar las complicaciones de la técnica en línea (inline), debemos registrar los eventos desde el código Javascript. Usando selectores Javascript podemos referenciar el elemento HTML y asignarle el manejador de eventos que queremos como si fuese una propiedad.

En el código del Listado 4-2 encontrará esta técnica puesta en práctica. Dos manejadores de eventos fueron asignados como propiedades a diferentes elementos. El manejador de eventos onload fue registrado para la ventana usando la construcción window. onload, y el manejador de eventos onclick fue registrado para el primer elemento <p> encontrado en el documento con la línea de código document.getElementsByTagName(‘p’)[0].onclick.

Conceptos Básicos: Los nombres de los manejadores de eventos son construidos agregando el prefijo on al nombre del evento. Por ejemplo, el nombre del manejador de eventos para el evento click es onclick. Cuando estamos hablando sobre onclick usualmente hacemos referencia al código que será ejecutado cuando el evento click se produzca.

Antes de HTML5, esta era la única técnica disponible para usar manejadores de eventos desde Javascript que funcionaba en todos los navegadores. Algunos fabricantes de navegadores estaban desarrollando sus propios sistemas, pero nada fue adoptado por todos hasta que el nuevo estándar fue declarado. Por este motivo recomendamos utilizar esta técnica por razones de compatibilidad, pero no la sugerimos para sus aplicaciones HTML5.

El método addEventListener()

El método addEventListener() es la técnica ideal y la que es considerada como estándar por la especificación de HTML5. Este método tiene tres argumentos: el nombre del evento, la función a ser ejecutada y un valor booleano (falso o verdadero) que indica cómo un evento será disparado en elementos superpuestos.

<!DOCTYPE html>

<html lang=»es»>

<head>

<title>Este texto es el título del documento</title>

<script>

function mostraralerta(){
alert(‘hizo clic!’);

}

function hacerclic(){

var elemento=document.getElementsByTagName(‘p’)[0]; elemento.addEventListener(‘click’, mostraralerta, false);

}

window.addEventListener(‘load’, hacerclic, false);

</script>

</head>

<body>

<div id=»principal»>

<p>Hacer Clic</p>

<p>No puede hacer Clic</p>

</div>

</body>

</html>

Listado 4-8. Agregando escuchas para eventos con addEventListener ().

El Listado 4-8 presenta el mismo código que el Listado 4-2 pero ahora una escucha fue agregada para cada evento usando el método addEventListener(). Para organizar el código en la función hacerclic(), asignamos la referencia al elemento a una variable llamada elemento y luego agregamos la escucha para el evento click usando esa variable.

La sintaxis del método addEventListener() es la mostrada en el Listado 4-8. El primer atributo es el nombre del evento. El segundo es la función a ser ejecutada, la cual puede ser una referencia a una función (como en este caso) o una función anónima. El tercer atributo especificará, usando true (verdadero) o false (falso), cómo múltiples eventos serán disparados. Por ejemplo, si estamos escuchando al evento click en dos elementos que se encuentran anidados (uno dentro de otro), cuando el usuario hace clic sobre estos elementos dos eventos click son disparados en un orden que depende de este valor. Si el atributo es declarado como true para uno de los elementos, entonces ese evento será considerado primero y el otro luego. Normalmente el valor false es el más adecuado para la mayoría de las situaciones.

Conceptos básicos: Funciones anónimas son funciones dinámicamente declaradas y que no tienen nombre (por esto son llamadas «anónimas»). Esta clase de funciones son extremadamente útiles en Javascript, nos ayudan a organizar el código y no sobre poblar el objeto global con funciones independientes. Usaremos funciones anónimas con frecuencia en los siguientes capítulos.

Incluso cuando los resultados de aplicar esta técnica y la anterior son similares, addEventListener () nos permite agregar tantas escuchas como necesitemos para el mismo elemento. Esta distinción le otorga a addEventListener() una ventaja sobre el resto, convirtiéndola en la técnica ideal para aplicaciones HTML5.

Debido a que los eventos son la clave para sitios webs y aplicaciones interactivas, varios fueron agregados en la especificación de HTML5. En próximos capítulos estudiaremos cada uno de estos nuevos eventos y el entorno en el trabajan.

Publicaciones Similares