2008-10-24 6 views
34

Sé que la mayoría de los enlaces deben dejarse en manos del usuario final para decidir cómo abrirlos, pero no podemos negar que hay momentos en los que 'tiene que' forzar una nueva ventana (por ejemplo, para mantener los datos en un formulario en la página actual).¿Cuál es la mejor manera de abrir una nueva ventana del navegador?

Lo que me gustaría saber es cuál es el consenso sobre la "mejor" forma de abrir un enlace en una nueva ventana del navegador.

Sé que <a href="url" target="_blank"> está fuera. También sé que <a href="#" onclick="window.open(url);"> no es ideal por una variedad de razones. También traté de reemplazar por completo los anclajes con algo como <span onclick="window.open(url);"> y luego darle un estilo al SPAN para que parezca un enlace.

Una solución a la que me inclino es <a href="url" rel="external"> y el uso de JavaScript para establecer todos los objetivos en '_blank' en los anclajes marcados como 'externos'.

¿Hay alguna otra idea? ¿Que es mejor? Estoy buscando la forma más fácil y más compatible con XHTML para hacer esto.

ACTUALIZACIÓN: Digo target = "_ blank" es un no no, porque he leído en several places que el atributo de destino va a ser eliminado de XHTML.

+0

hice búsqueda de preguntas/respuestas similares antes, pero no encontró nada para responder a mi pregunta. – Kon

+0

¿Por qué target = "_ blank" a no no? –

+2

todo mal. Deberías ir por un guión discreto. ¿Qué sucede con un navegador que no es js? ¿Cómo pueden usar su sitio/aplicación? – redsquare

Respuesta

37

Estoy utilizando el último método que ha propuesto. Añado rel = "externo" o algo similar y luego usar jQuery para iterar a través de todos los enlaces y asignarles un controlador de clic:

$(document).ready(function() { 
    $('a[rel*=external]').click(function(){ 
    window.open($(this).attr('href')); 
    return false; 
    }); 
}); 

Me parece el mejor método porque:

  • muy es borrar semánticamente: usted tiene un enlace a un recurso externo
  • es compatible con los estándares
  • se degrada con gracia (que tienen un vínculo muy simple con atributo regular href)
  • que todavía permite que el usuario medio clic en el enlace y abrirlo en una nueva pestaña si así lo desean
+0

Sí, este parece ser mi enfoque favorito más reciente. Solo me preguntaba si a alguien se le ocurrió alguna otra forma hábil. – Kon

+0

Tener que pasar por estos aros es probablemente la razón por la cual el atributo objetivo reaparece en XHTML 2.0. – tvanfosson

+0

@tvanfosson una pequeña corrección: reaparece en XHTML5, no en XHTML 2.0. XHTML5 es una serialización XML de HTML5, mientras que XHTML 2.0 es una mejora en XHTML 1.1. De todos modos, rel = "external" mejora la semántica, mientras que target = "_ blank" es una directiva de comportamiento (que debe dejarse a JS) –

13

¿Por qué es target="_blank" una mala idea?

Se supone que debe hacer exactamente lo que quiere.

editar: (ver comentarios) punto tomado, pero creo que el uso de javascript para hacer tal tarea puede llevar a algunas personas bastante molestas (aquellos que hacen clic medio para abrir en una nueva ventana por hábito, y aquellos que use una extensión de NoScript)

+1

Causará que el validador XHTML muestre un error porque se ha eliminado del estándar. Personalmente, creo que fue un mal movimiento. Ahora las personas piensan que sh * t gusta "" solo para evitarlo y aún así ser "válido". – Tomalak

+0

En XHTML 1.0 Strict y XHTML> 1.1 "objetivo" no está permitido el atributo de la etiqueta "a". –

+0

Cree que el problema es con los navegadores con pestañas. No está claro si esto significa abrir un nuevo navegador, abrir una nueva pestaña o abrir una ventana secundaria del navegador existente. –

2

Tal vez estoy malinterpretando algo pero ¿por qué no quiere usar target = "_ blank"? Esa es la forma en que lo haría. Si está buscando el más compatible, entonces se eliminará cualquier tipo de JavaScript, ya que no puede estar seguro de que el cliente tenga habilitado JS.

+0

Tiene razón acerca de que JS está habilitado como requisito. Aunque creo que rel = external es una solución discreta, porque es compatible con XHTML y obliga a abrir en una ventana diferente solo si JS está habilitado. – Kon

+0

Para mi aplicación de TI interna, ciertas páginas de formulario deben crearse como nuevas pestañas. En Firefox se sobreescribieron porque les di un nombre, pero este _blank nombre de página me permitió crear más de uno, según sea necesario, en sus propias pestañas. Así que gracias por la propina. –

1
<a href="http://www.google.com" onclick="window.open(this.href); return false"> 

Esto todavía se abrirá el enlace (aunque en la misma ventana) si el usuario ha desactivado la JS. De lo contrario, funciona exactamente igual que target = blank, y es fácil de usar, ya que solo tiene que agregar la función onclick (quizás usando JQuery) a todas las etiquetas normales.

+0

Pero seguramente no le gustaría poner dicho controlador onclick en cada enlace de su sitio que requiera que se abra en una nueva ventana/pestaña. – Kon

+0

Por qué no, aunque podría decirse que es demasiado detallado, es ciertamente aceptable y está en el espíritu de la especificación. –

0

Si utiliza cualquier sabor de tipo de documento estricta o de los próximos XHTML sabores reales, el objetivo no está permitido ...

Uso de transición, cualquiera que sea HTML4.01 o XHTML1, se puede utilizar la solución Damirs, a pesar de que no ejecuta el windowName-propiedad que es necesaria en window.open():

En HTML plano:

<a href="..." target="_blank" onclick="window.open(this.href, 'newWin'); return false;">link</a> 

Sin embargo, si se utiliza uno de los tipos de documento estrictos su única forma de abrir enlaces sería usar esta solución sin el atributo de destino ...

- por cierto, la cantidad de navegadores que no son js a menudo se calcula mal, buscando los números de los contadores se refieren a números muy diferentes, y me pregunto cuántos de esos navegadores que no son js son rastreadores y similares. -)

+0

Desactivo js en "algunos" sitios web;) – Luk

+0

usando el nombre para ventana en window.open es * muy * molesto - reemplazará inesperadamente el contenido de otra ventana (es problemático cuando el mismo nombre se usa para más de un enlace en la página) – Kornel

+0

Pero es obligatorio, de modo que el código ilegal será el resultado si se lo pierde ... – roenving

0

Si estoy en una página de formulario y hago clic en un enlace moreinfo.html (por ejemplo) hace que pierda datos a menos que lo abra en una nueva pestaña/ventana, solo dígame.

Puede engañarme para abrir una nueva pestaña/ventana con window.open() o target = "_ blank", pero podría tener objetivos y ventanas emergentes deshabilitados. Si se requieren JS, objetivos y ventanas emergentes para que me engañe y abra una nueva ventana/pestaña, dígamelo antes de comenzar con el formulario.

O bien, haga enlaces a otra página para solicitar un formulario, de modo que cuando el visitante envíe, los datos del formulario actual se guarden para que puedan continuar desde la última vez, si es posible.

+0

No siempre es bajo el control del desarrollador cómo debe comportarse la página. No puedo simplemente introducir mensajes/comentarios 'ayudantes' en el sitio web de una gran empresa farmacéutica. – Kon

+0

Es cierto. FWIW, veo muchos sitios que simplemente usan un URI de JavaScript en el href para abrir una nueva ventana. Entonces, cuando JS está apagado, el enlace simplemente no funciona. Por supuesto, target = "_ blank" funcionará igual de bien y funcionará con JS desactivado. Puede que no valide, pero funcionará, que es más importante. – Shadow2531

2
<a href="http://some.website.com/" onclick="return !window.open(this.href);">link text</a> 

Los detalles se describen en mi answer to another question.

+0

Simple y elegante. – too

11

Por favor, no fuerce abriendo un enlace en una nueva ventana.

razones en contra:

  • infringe la regla de la mínima sorpresa.
  • El botón de retroceso no funciona y el usuario no sabe por qué.
  • ¿Qué sucede en los navegadores con pestañas? Nueva pestaña o nueva ventana? Y lo que ocurra, ¿es lo que quieres, si mezclas pestañas y ventanas?

La razón por la que siempre escucho a favor de abrir una nueva ventana es porque el usuario no abandonará el sitio. Pero asegúrese, nunca volveré a un sitio que me molesta. Y si el sitio me quita el control, eso es una gran molestia.

Una forma puede ser que proporcione dos enlaces, uno es normal y el otro lo abre en una nueva ventana. Agregue el segundo con un pequeño símbolo después del enlace normal. De esta forma, los usuarios de su sitio mantienen el control del enlace en el que desean hacer clic.

+1

Esto no responde la pregunta. ¿Qué pasa si hay un caso de uso real para que el enlace se abra en una nueva ventana? Incluso me molesta cuando esto se hace sin previo aviso, pero no deberíamos descartar los casos de uso reales solo por esta molestia. – iankit

5

Aquí es un plugin que escribí para jQuery

(function($){ 
    $.fn.newWindow = function(options) {  
    var defaults = { 
     titleText: 'Link opens in a new window'  
    }; 

    options = $.extend(defaults, options); 

    return this.each(function() { 
     var obj = $(this); 

     if (options.titleText) {   
      if (obj.attr('title')) { 
        var newTitle = obj.attr('title') + ' (' 
               + options.titleText + ')'; 
      } else { 
        var newTitle = options.titleText; 
      };    
      obj.attr('title', newTitle);    
     };   

     obj.click(function(event) { 
      event.preventDefault(); 
      var newBlankWindow = window.open(obj.attr('href'), '_blank'); 
      newBlankWindow.focus(); 
     });  
     });  
    }; 
})(jQuery); 

Ejemplo de Uso

$('a[rel=external]').newWindow(); 

También puede cambiar o quitar el texto del título, mediante el paso en algunas opciones

Ejemplo para cambiar el texto del título:

$('a[rel=external]').newWindow({ titleText: 'This is a new window link!' }); 

Ejemplo para eliminarla alltogether

$('a[rel=external]').newWindow({ titleText: '' }); 
0

utilizo este ...

$(function() { 
    $("a:not([href^='"+window.location.hostname+"'])").click(function(){ 
    window.open(this.href); 
    return false; 
    }).attr("title", "Opens in a new window"); 
}); 
Cuestiones relacionadas