En la entrada anterior, vimos los objetos básicos en javascript. Ahora vamos a ver cómo usarlos para seleccionar elementos.
Hay actualmente muchos métodos para seleccionar elementos del DOM (básicamente la estructura de una página web). Por desgracia, si se quiere seleccionarlos efectivamente en diferentes navegadores, no están todos disponibles (esto es lo que pasa cuando los navegadores antiguos , como IE 7-8, no dejan de ser utilizados). Vamos a darles un repaso a todos:
document.getElementById
Éste es más seguro de utilizar, junto con getElementsByTagName
. Como su nombre indica, sirve para seleccionar un elemento por su ID. ¿Y qué es el id? Cuando escribimos una etiqueta HTML podemos configurar su atributo id. Así, si probáis en la consola (ver la entrada anterior) document.getElementById('parrafo-ejemplo')
(cuidado con las letras mayúsculas), deberíais de obtener éste mismo párrafo. ¿Por qué? Porque este texto está escrito entre <p id='parrafo-ejemplo'>
y </p>
.
Nota: Éste método es el único que requiere llevar document
al principio. El resto pueden llevar o bien document
, o bien un contexto. Un contexto es un elemento previamente seleccionado. Sólo en ese elemento se seleccionará lo indicado (veremos un ejemplo abajo). Si usamos document
buscaremos en toda la página actual.
document.getElementsByTagName
Éste elemento selecciona todos los elementos que tengan una determinada etiqueta (div, a, p...
) dentro del contexto. Al seleccionar varios elementos, nos tiene que devolver una array
bueno, no exactamente, nos devuelve una colección de elementos, pero la forma de acceder es la misma, así que ya deberíamos saber. La etiqueta *
es un comodín, así que devuelve todas las etiquetas (o sea, todos los elementos).
Vamos a ver un ejemplo con contexto:
//Con la coma declaramos varias variables
//El párrafo será el contexto
var elParrafo = document.getElementById('parrafo-ejemplo'),
//Los códigos será la lista de elementos con la etiqueta <code> dentro de ese párrafo
losCodigos = elParrafo.getElementsByTagName('code');
//Seleccionamos el primer elemento, y mostramos por pantalla su contenido (innerHTML, que no tenéis por qué saberlo)
alert(losCodigos[0].innerHTML)
Por pantalla debería de salir «getElementsByTagName», que es el contenido del primer código del párrafo.
getElementsByClassName
El uso es similar a getElementsByTagName
, sólo que en vez de devolver elementos según una etiqueta, los devuelve según la clase del elemento. Por ejemplo, vete a la página principal y usa document.getElementsByClassName('postCon')
. Seleccionarás todos los contenedores que uso para los posts.
Éste método está disponible en todos los navegadores excepto IE < 9. Para ver tablas completas ve aquí.
querySelector y querySelectorAll
Éstos métodos son los más intuitivos y fáciles de usar pero, al igual que no está disponible en IE7 (aunque ahora mismo no lo considero un inconveniente para usarlo) (tampoco está en firefox 3, pero es una versión no utilizada en absoluto). Estos métodos usan cadenas similares a las de CSS para seleccionar elementos. getElementsByClassName
, no están disponibles en IE menor a 9querySelector
sólo selecciona el primer elemento encontrado, mientras que querySelectorAll
selecciona todos. Por ese mismo motivo, uno devuelve el elemento en sí y otro una colección. Veamos un ejemplo:
//El primer párrafo del post
var primerParrafo = document.querySelector('.post-body p'),
//Recordad que el 0 es el primero
segundo = document.querySelectorAll('.post-body p')[1],
elTextoDeAmbosJuntos = primerParrafo.innerHTML + segundo.innerHTML;
//Para escribirlo
document.querySelector('#parrafo-vacio').innerHTML = elTextoDeAmbosJuntos;
Ahora deberíais de ver el texto de ambos juntos en el párrafo superior a este. Para volver a vaciar el párrafo podéis usar document.querySelector('#parrafo-vacio').innerHTML = ""
Seleccionar un elemento desde otro
Supón que quiero seleccionar este post, pero no tengo forma segura de hacerlo (salvo darle una ID). Sin embargo, sabemos que hay un párrafo con la id párrafo vacío que es hijo de este post. ¿Cómo seleccionarlo a partir de ese párrafo?
Cada elemento tiene ciertas propiedades que nos permiten acceder a otros elementos. Algunas de las más conocidas y seguras son parentNode, previousSibling y nextSibling
, que seleccionan el elemento padre, el anterior y el siguiente (estos dos últimos pueden seleccionar nodos de texto, así que cuidado). Igualmente para seleccionar hijos tenemos children y childNodes
(sobre los que profundizaremos más adelante). Así que para seleccionar el post tendríamos que hacer:
var elParrafo = document.getElementById('parrafo-ejemplo'),
elPost = elParrafo.parentNode;
//Mostramos la clase del post (sólo para asegurarse de que funciona)
alert(elPost.className)
Conclusión
Espero que os sea útil esta información. Para acabar, me gustaría que pensarais sobre una frase que escribí en la entrada anterior: En javascript todo es un objeto. Fijaos en la forma de acceder a las funciones propias del documento. ¿ O acaso document.getElementById
no es similar a persona.mostrarNombre
? ¿No es lo mismo acceder al padre de un elemento usando elemento.parentNode
que acceder a la altura de una persona usando persona.altura
, o usar document.getElementsByTagName
y "miString".split
?
Espero que esta pequeña reflexión os ayude a verlo todo con otros ojos, para que podáis ver que realmente en javascript podemos editarlo todo.
P.D.: Ahora que ya sabemos seleccionar elementos, el próximo paso será editarlos, ¿no?