Cristalab

                 ¿Quieres registrarte?

Cómo abrir una nueva ventana en XHTML Strict

11 de Octubre del 2007
9,093 visitas

La recomendación de XHTML Estricto ha eliminado el atributo target en la etiqueta de vínculos (<a>), por lo que su uso en el código HTML o XHTML impedirá que nuestros sitios sean válidos ¿Pero cómo resolver el problema cuando realmente necesitamos (sin tener en cuenta los molestos pop-up) que nuestro vínculo se abra en una ventana/pestaña aparte? La respuesta: echando mano de un nuevo atributo de vínculos (el atributo rel) y de un pequeño código en Javascript.

El Atributo rel:


Ya existente en la etiqueta link, es añadido a la etiqueta a para darle significado semántico a los vínculos. En otras palabras, permite establecer la relación entre la página donde está el vínculo y la página a donde lleva. Aunque tiene algunos valores determinados, es permitido colocar valores personalizados por parte del diseñador/desarrollador.

Esta flexibilidad del atributo rel ha permitido darle otras aplicaciones por parte de los buscadores como Google o Yahoo!, que han acordado no hacer seguimiento de los vínculos cuyo atributo rel sea “nofollow”, para ayudar a combatir el endemoniado spam (Yeah! :D ), o el caso de Technorati, que promueve el uso del valor “tag” para ayudar en la búsqueda por etiquetas.

Esta misma flexibilidad es la que usaremos para nuestra técnica. ;)

Lo primero que debemos hacer es agregar a nuestras etiquetas <a> el atributo rel, al que asignaremos el valor que usaremos para saber cuáles son los vínculos que queremos abrir en una ventana nueva (no es obligatorio, pero dado que se ha estado volviendo un estándar, usaremos el valor external). Por ejemplo, si queremos aplicar esta técnica a un vínculos a cristalab.com, colocaríamos:

<a href="http://www.cristalab.com" title="Cristalab" rel=”external”>cristalab.com</a>

Una vez hecho esto, creamos un documento .js donde escribiremos el código javascript que hará “la magia” ;) . En él escribiremos esto:

Código :

function openExternal(){
    if(!document.getElementsByTagName) return;
    var anchors = document.getElementsByTagName(’a');
    for(var i = 0; i < anchors.length; i++){
        var thisAnchor = anchors[i];
        if(thisAnchor.getAttribute(’href’) && thisAnchor.getAttribute(’rel’) == ‘external’){
            thisAnchor.target = ‘_blank’;
        }
    }
}

window.onload = openExternal;

Expliquemos un poco el código:

Lo primero que hacemos es crear una función (en este caso la he llamado “openExternal”). Esta función es la que:


  1. Chequeará que haya etiquetas en nuestro (X)HTML. Si no las encuentra, sale de la función sin devolver ningún resultado.

    Código :

     if(!document.getElementsByTagName) return;
    

  2. En caso de encontrarlas, las almacenará en un Array

    Código :

    var anchors = document.getElementsByTagName('a');
    

  3. Por medio de un Bucle for, chequeamos dos cosas:

    1. Que el vínculo tenga un atributo href.
    2. Que el atributo rel sea “external”.

  4. Si ambas condiciones son ciertas, agregamos al vínculo el atributo target y le asignamos el valor _blank.

    Código :

    for(var i = 0; i < anchors.length; i++){
        var thisAnchor = anchors[i];
        if(thisAnchor.getAttribute('href') && thisAnchor.getAttribute('rel') == 'external'){
            thisAnchor.target = '_blank';
        }
    }
    
    


Esta sería toda la función. Ahora lo único que nos queda es llamarla cuando se cargue la página para que se ejecute después que todos los vínculos han sido cargados y antes que el usuario haga algo.

Código :

window.onload = openExternal;


Una vez escrito el código, guardamos nuestro archivo y le colocamos un nombre que nos permita identificar qué hace (yo llamé al mío external_links.js).

¿Por qué guardarlo en un archivo aparte? Por dos razones:


  1. Hacemos nuestro (X)HTML más limpio separando la maquetación (el HTML como tal) de la programación, así se lee mejor y podemos dedicarnos a cada cosa (la maquetación o la programación) separadamente sin afectar el otro archivo. Esta es la misma razón para usar archivos .css para dar estilo a nuestro HTML.
  2. Hacemos nuestro código reusable porque, al estar en un archivo aparte, si lo necesitamos en otro proyecto sólo tendremos que copiarlo en la carpeta del siguiente proyecto sin tener que copiar y pegar el código cada vez.

Ahora lo único que nos falta es asociarlo a nuestro archivo .html, lo que hacemos a través de la etiqueta <script>, colocando entre las etiquetas <head> y </head>:

Código :

<script type="text/javascript" src="scripts/external_links.js"></script>


En este caso asumo que el archivo está dentro de una carpeta llamada “scripts”, que está en la raíz del sitio, si lo guardas en un sitio diferente, debes cambiar la ruta por la tuya.

¡Y eso es todo! Espero que les sea de ayuda ;)

Por razones de usabilidad, es recomendable al menos advertir al usuario que los links se abrirán en una ventana nueva, o darle la opción de abrirlo también en la misma ventana, si así lo desea.

Nota Importante: Existe actualmente una discusión respecto a si ésta y otras técnicas utilizadas con el mismo propósito no son más que una simple "trampa" para hacer que un código "inválido", valide en XHTML Strict. No voy a exponer aquí las razones por las que considero que esta técnica es válida -en tal caso, ya hice eso en mi blog (valga el spam)- porque no es de eso de lo que se trata este tip. En último caso recomendaré lo de siempre: No tienes porque fiarte sin más de lo que digo, investiga, aprende y saca tus propias conclusiones; quizá no sean verdad, pero al menos serán tuyas. ^^


Artículos Relacionados


Etiquetas html

Comentarios | Enviar un comentario
Son el tipo de vainas que son una boleta, pero que toca hacer para poder validar el documento... colocar el target con javascript, que vuelta maluca... :S

Nota: Aclaro que no ataco el articulo ni al autor. Por si las moscas... :)

Saludos
Por: bipsa
Exacto. No discutiremos si es o no correcta (en su uso). De que funciona, funciona ;)
Por: Pedro

bipsa :

Son el tipo de vainas que son una boleta, pero que toca hacer para poder validar el documento... colocar el target con javascript, que vuelta maluca... :S
Es que es un cambio de filosofía "bipsa"

La filosofía de XHTML Strict no es: "Vamos a joderte para que abrir nuevas ventanas sea difícil". La filosofía es: "Tu no tienes por qué obligar al usuario a abrir nuevas paginas".

Pero eso requiere acostumbrar al usuario y al dev.
Por: Freddie

Freddie :

La filosofía es: "Tu no tienes por qué obligar al usuario a abrir nuevas paginas"..
Pero eso requiere acostumbrar al usuario y al dev.


Si esa es la filosofia no es necesario este tip.

Saludos
Por: bipsa

bipsa :

Freddie :

La filosofía es: "Tu no tienes por qué obligar al usuario a abrir nuevas paginas"..
Pero eso requiere acostumbrar al usuario y al dev.

Si esa es la filosofia no es necesario este tip.
La filosofía con la que fue hecho un lenguaje no implica que no se quieran hacer cosas que se hacían antes. Mucha gente aun usa ENTER_FRAME en Actionscript 3 cuando se debe usar un Timer.

Tampoco porque esa sea la filosofía de un lenguaje implica que está bien o que sea la verdad absoluta. Igual, no estás obligado a usar XHTML Strict y siempre, como todos, puedes usar Transitional.
Por: Freddie
Bueno, ya decía en el tip que el tema tiene su historia. De hecho, cuando estaba investigando sobre el asunto me encontré muchas opiniones que iban desde "Si la W3C lo ha matado, muerto está" hasta "Me importa un carajo bledo la W3C si el site hace lo que quiero y se ve bien en los navegadores". Yo mismo dudé en utilizarlo porque estoy de acuerdo con Freddie en que la filosofía es "todo el control al usuario", es a él a quien le pertenece la red, no al desarrollador/diseñador (es por eso que puse la nota de advertir al usuario si la página se abrirá en una nueva pestaña, e incluso, dejarle decidir a él).

Por otro lado (todo esto según lo que investigué) también es cierto que "target" existe de hecho en el DOM (incluso en su versión 2.0, que apareció después de las (X)HTML Strict, lo que significa que su uso sigue siendo válido, así que no se rompe ninguna regla. En los hechos estamos usando ambos estándares.

Sin querer enrollarme más con el tema. Creo que el asunto se zanja dándole al usuario la oportunidad de decidir que hacer, que podría ser colocando el mismo link con y sin el "rel=external" y advirtiéndole claramente lo que ocurrirá en cada caso. Creo que eso ayuda más que simplemente esperar a que aprenda "por ósmosis" que haciendo Ctl+click (Shift+click en IE6) abrirá el link en una ventana nueva. Mientras más opciones (bien implementadas) das al usuario más usable es tu web.
Por: The Fricky!
Con eso se puede ayudar a hacer esto: http://mapa.buenosaires.gov.ar/sig/index.phtml?

Eso es java pero.... Se podría hacer en flex o flash??? ¿algún tuto? mmm
Por: no_entiendo_nada_blog
No, realmente el tip no tiene nada que ver con eso :roll:
Por: The Fricky!
A mi en lo particular darle al usuario una nota de uso para los links lejos de facilitarle las cosas se las complica.

Necesita el usuario instrucciones para manejar los links? No.

Como bien dijo alguien, el usuario debe tener el control absoluto sobre como consumir los contenidos ADEMÁS debe ser de la forma más fácil posible, esto es sin instructivos.
Por: Droid_blog
Código "cofh" robado "cofh"
Por: frenadoll_blog
A mí todo esto me genera dos dudas:

1) Es óptimo tener que parsear todas las etiquetas en busca de un link? (es que me parece muy heavy)

2) Si realmente lo que pretende la w3c es que no se le puedan abrir nuevas ventanas al usuario, esto realmente es un rodeo para validar pero saltándose la recomendación de la w3c, no?

Ya sé que al final cada uno puede hacer lo que quiera, pero me extraña que la w3c no haya buscado una solución a todo esto.

De todas formas es un buen tip, a tener en cuenta.
Por: roferto_blog

Freddie :

Tampoco porque esa sea la filosofía de un lenguaje implica que está bien o que sea la verdad absoluta. Igual, no estás obligado a usar XHTML Strict y siempre, como todos, puedes usar Transitional.
¿Esta muy en uso el XHTML Strict?
Realmente, parece un poco tocapelotas el asunto. Yo me hubiese decantado por el Trasitional, parece la opción mas lógica ¿no? :?
Por: Bleend
Mas allá de la "filosofía", palabra en la cual me parece desajustada en este caso, se debe pensar en la usabilidad entendiéndose como la capacidad de una aplicación en ser comprendida, aprendida y usada. Por lo que hay un límite en cuando se debe guiar a la persona con ayudas o mensajes, si por ejemplo en el caso de link las ayudas guían o como bien lo expresaban antenriormente el concepto de presentación de un "link" es algo para el usuario intuitivo en su manejo y al agregarle tips se vuelva mas engorroso que el mismo PopUp.
Por: vanvanero_blog

frenadoll_blog :

Código "cofh" robado "cofh"

Te equivocas. El código no es robado, es prendido, lo que es diferente. En mi blog está citada la fuente. :roll:
Por:
Perdón, quise decir "aprendido", no "prendido" (No estaba logueado ;) )
Por: The Fricky!
Me gusto el tip.
En lo personal, me molesta un poco cuando una pagina se abre sola, pero hay veces que es necesario hacerlo (un ejemplo es el pop-up de aqui a la hora de poner emoticones) preferiria emplear ajax para eliminar ese tipo de pop-ups... si, offtopic.
Me gusto el tip, y me gusto que sea (casi) no intrusivo.
Por: Dientuki
Mi opinión. (no va dirigida a nadie en especial)

Yo quiero usar target. Lo pongo como atributo de mi nodo "a", punto.
No quiero usar target. No lo pongo como atributo de mi nodo "a", punto.

El hecho de que un sitio sea válido, no es solo sintácticamente cumplir con el estandar. También implica lógicamente, y eso solo un ser humano lo puede validar.

La regla es clara, los links no deben usar target, así EL USUARIO decide donde quiere abrirlo. Mas claro no puede ser, da igual poner el target por javascript, por xhtml o en cualquier otro super invento que tengan, el punto es respetar el estandar. Yo me sentiría engañado viendo una imagen de xhtml válido, en mi sitio, si sé que el estandar lo rompo con cosas que el analizador semántico y sintáctico automatizado, no entenderá por que no es un ser pensante.

Vamos en otras palabras, que tan estandar o no es un sitio, no te lo da un validador tonto de código, te lo da tu misma funcionalidad.

:wink:
Por: Dano
excelente tips.. gracias..!
Por: jripper
Esto es solamente un Tip, no es un "tienen que hacerlo porque está aquí", el objetivo es enseñar a hacerlo y nada más.
No se como pueden salir discuciones, aunque a mi ya me pasó esto en el tip de evitar seleccionar texto con javascript, me reclaman usabilidad y bla bla bla, pero bueno, siempre están los usuarios inteligentes y los usuarios L.
Por: Carloz.Yanez
Así se puede hacer con mootools por ejemplo:

Código :

$$('a.external').each(function(link){
   link.target = "_blank";
});


Por: frenadoll_blog
Como puedo saber y aprender mas de action script mi correo electronico es intel_javi@hotmail.com
Por: javier _blog
Esto es solamente un Tip, no es un "tienen que hacerlo porque está aquí", el objetivo es enseñar a hacerlo y nada más.


Tienes razón, en mi caso, no pretendo discutir(e intente aclararlo), si no mas bien dar mi opinión a gente que llegará el tip, desorientada en el sentido a si debe o no hacerlo.

saludos :wink:
Por: Dano
Yo entiendo la posición de Dano. Ciertamente la validación "real" es un elemento humano y no puede ser dado simplemente por una máquina. La intención del tip no es por supuesto decir que debas hacerse de esta o de otra manera, es una forma de trabajar (por eso los dos últimos párrafos). Cada persona debe utilizarlo consciente y responsablemente; de hecho ésta es una forma de hacerlo, hay muchas, y en todas las discusiones aparecen los temas de si es o no válido, o es o no conveniente, o el usuario es un tonto o no lo es.
También creo que, ya que la validación y la toma de decisiones es un elemento real, debe basarse en elementos reales, y en ese caso creo fervientemente que debemos dejar de lado "nuestro modo de navegar" como elemento de juicio, porque todos sabemos que la mayoría de nosotros somos "una rareza" en internet y "nuestro modo de navegar" está claramente influenciado por nuestros conocimientos acerca de la red, exploradores, código, etc. Si debemos juzgar es obligatorio que lo hagamos como "usuarios" y no como diseñadores/desarrolladores. Es por eso que existe la usabilidad, porque no todos (de hecho sólo una minoría) somos "frikis". Como decía antes, usar o no este o cualquier otro tip debe ser una decisión pensada, analizada y tomada a conciencia por cada uno y por cada proyecto en particular, dando siempre al usuario la posibilidad de decidir si quiere hacerlo o no, lo que no es válido es imponer una sola forma de hacer las cosas y obligar al usuario a volverse un experto para que navegue en nuestros sitios como desee.
Por: The Fricky!
para javier (te llamas como io xD):

BUSCA Y ENCONTRARÁS ;) si lo haces con conviccioón mejor aún ya lo verás!!! y esto se aplica en todo chocherita (y)

Saludos desde Perú.





//Y para vos también va no la flashees :)
Por: sinrazon_blog

Carloz.Yanez :

Esto es solamente un Tip, no es un "tienen que hacerlo porque está aquí", el objetivo es enseñar a hacerlo y nada más.
No se como pueden salir discuciones, aunque a mi ya me pasó esto en el tip de evitar seleccionar texto con javascript, me reclaman usabilidad y bla bla bla, pero bueno, siempre están los usuarios inteligentes y los usuarios L.
No creas Carlos. Estas discusiones son buenas.

Si sólo hubiera un punto de vista de una situación, no se evolucionaría ni se crearían mejores cosas.
Por: Freddie
A mi me vale la validación de 3WC (si WC), muchas de los errores que te marcan son una estúpidez. De nada sirve tener un documento con 0 errores, de hecho, pocas páginas lo tienen porque se necesitarían horas inecesarias para validar el documento.

La validaciones están hechas para freakes que quieren complicar la vida del programador.
Por: spacecowboy

spacecowboy :

A mi me vale la validación de 3WC (si WC), muchas de los errores que te marcan son una estúpidez. De nada sirve tener un documento con 0 errores, de hecho, pocas páginas lo tienen porque se necesitarían horas inecesarias para validar el documento.

La validaciones están hechas para freakes que quieren complicar la vida del programador.
Las validaciones tienen un sentido, en el teorico mundo perfecto la W3C crea las recomendaciones y los estandares web que todo navegador debe cumplir, los desarrolladores de navegadores deben crearlos de manera tal que apliquen esas recomendaciones en los navegadores, todo eso es para que el desarrollador trabaje de acuerdo a un estandar y luego lo que realice se vea bien en los navegadores.
A todo esto debo decir, que nacio el maligno y se fue al tacho el perfecto mundo teorico.

El maligno, IE; navegadores, el resto
Por: Dientuki
Si un documento viene dado como strict, el atributo target no debería funcionar aún cuando lo hayas puesto de nuevo mediante javascript. Eso es un error del navegador. Si tu le dices que es XHTML strict no debería tratarlo como HTML 4.0 transitional..
Por: zert_blog
Te equivocas zert_blog. Aunque en XHTML Strict no aparezca el target, sí que existe aún en el DOM de Javascript (que, por cierto, se actualizó a la versión 2.0 después de existir XHTML Strict); y ya que el DOM es independiente de HTML Strict y XHTML Strict, ambas especificaciones resultan válidas y el explorador debería reconocerlas. Otra cosa sería que hubiesen eliminado el target en el DOM.
Por: The Fricky!
Usar el target y el XHTML strict, es hacer trampas, si quieres que tu documento cumpla XHTML strict no uses esa trampa javascript. para este caso caso usa XHTML transicional
Por: puchinboy_blog

puchinboy_blog :

Usar el target y el XHTML strict, es hacer trampas, si quieres que tu documento cumpla XHTML strict no uses esa trampa javascript. para este caso caso usa XHTML transicional
Y tu sugerencia para no hacer trampa y lograr el objetivo del tip es?
Por: Freddie
el script copiado tal cual no funciona.

Este de [url]sitepoint.com sí:

function externalLinks() {
if (!document.getElementsByTagName) return;
var anchors = document.getElementsByTagName("a");
for (var i=0; i<anchors.length; i++) {
var anchor = anchors[i];
if (anchor.getAttribute("href") &&
anchor.getAttribute("rel") == "external")
anchor.target = "_blank";
}
}
window.onload = externalLinks;
Por: alfonso marcos vidal de l
Todo lo que quiero es ver simsonizados on line!!!!! contactenme mafyta.09@hotmail.com
Por: zorrita.com-blog
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.