2009-10-15 20 views
113

Cuando un usuario hace clic en un enlace, necesito actualizar un campo en una base de datos y luego abrir el enlace solicitado en una nueva ventana. La actualización no es un problema, pero no sé cómo abrir una nueva ventana sin que tengan que hacer clic en otro hipervínculo.Cómo simular target = "_ blank" en JavaScript

<body onLoad="document.getElementById('redirect').click"> 
<a href="http://www.mydomain.com?ReportID=1" id="redirect" target="_blank">Report</a> 
</body> 
+1

¿Hm? 'target =" _ top "' no se abre en una nueva ventana - 'target =" _ blank "' hace. – Tomalak

+0

Si el enlace ya se está abriendo en una nueva ventana (debido a target = "_ blank") y el manejador de clics de javascript ya está actualizando su base de datos, ¿por qué debería abrir la nueva ventana con Javascript? –

Respuesta

208
<script> 
    window.open('http://www.example.com?ReportID=1', '_blank'); 
</script> 

El segundo parámetro es opcional y es el nombre de la ventana de destino.

+1

'window.open' hace lo que' target = "_ blank" 'hace - abre la URL en una nueva ventana. – ceejayoz

+2

sí. el segundo argumento para window.open() es el "nombre" que desea dar a la ventana, similar a establecer un destino en un enlace. https://developer.mozilla.org/En/DOM:window.open –

+1

Oh, ya veo. window.open está bloqueado por el bloqueador de pop-ups de Firefox, pero target = "_ blank" no lo es. ¿Debo simplemente pedirle al cliente que active las ventanas emergentes desde su propio sitio web? –

2

Puede extraer el href de la etiqueta:

window.open(document.getElementById('redirect').href); 
7

Sé que esto es un hecho y lo solucionaron cosa, pero esto es lo que estoy usando para resolver el problema en mi aplicación.

if (!e.target.hasAttribute("target")) { 
    e.preventDefault();  
    e.target.setAttribute("target", "_blank"); 
    e.target.click(); 
    return; 
} 

Básicamente lo que está pasando aquí es corro un cheque por si el enlace tiene target=_blank atributo. Si no lo hace, se detiene el enlace de activación, lo configura para abrir en una nueva ventana y luego hace clic en él programáticamente.

Puede ir un paso más allá y saltar a la interrupción del clic original (y hacer que el código mucho más compacto) al tratar de esto:

if (!e.target.hasAttribute("target")) { 
    e.target.setAttribute("target", "_blank"); 
} 

Si estaba utilizando jQuery para abstraer la implementación de añadir un atributo multi-navegador, se debe utilizar esto en vez de e.target.setAttribute("target", "_blank"):

jQuery(event.target).attr("target", "_blank") 

es posible que tenga que volver a trabajar para adaptarse a su uso-caso exacto, pero así es como me rasqué la propia picazón.

Aquí hay un demo en acción para que te metas con.

(El eslabón de jsFiddle regresa a esta discusión .. no hay necesidad de una nueva pestaña :))

6

Yo personalmente prefiero utilizar el siguiente código si es para un solo enlace. De lo contrario, es mejor si crea una función con un código similar.

onclick="this.target='_blank';" 

Empecé a usar eso para eludir la estricta prueba XHTML del W3C.

+0

Creo que el JavaScript en línea es más complicado que agregar un atributo "no estándar" que funciona en todas partes. –

+0

@MattiVirkkunen en ciertas situaciones, es la única solución –

+0

@Claudiu: si te encuentras en una situación tan absurda, deberías arreglar la causa más que evitarlo. –

5

Así es como lo hago con jQuery. Tengo una clase para cada enlace que quiero que se abra en una ventana nueva.

$(function(){ 

    $(".external").click(function(e) { 
     e.preventDefault(); 
     window.open(this.href); 
    }); 
}); 
14

Esto podría ayudar

var link = document.createElementNS("http://www.w3.org/1999/xhtml", "a"); 
    link.href = 'http://www.google.com'; 
    link.target = '_blank'; 
    var event = new MouseEvent('click', { 
     'view': window, 
     'bubbles': false, 
     'cancelable': true 
    }); 
    link.dispatchEvent(event); 
+1

Esto debería ser aceptado como respuesta. – ebilgin

+0

IE11: "Error de Javascript en tiempo de ejecución: no es una acción válida para el objeto" –

+4

Esta respuesta podría mejorarse al agregar una descripción de lo que está sucediendo –

1

Esto le podría ayudar a abierto todo el página de enlaces:

$(".myClass").each(
    function(i,e){ 
     window.open(e, '_blank'); 
    } 
); 

se abrirá cada <a href="" class="myClass"></a> elementos de enlace a otra pestaña igual que lo tenía hizo clic en cada uno.

Solo tiene que pegarlo en la consola del navegador. jQuery marco requerido

Cuestiones relacionadas