Sé que este es un trato hecho y resuelto, 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á sucediendo aquí es que verifico si el enlace tiene un target=_blankatributo. Si no lo hace, detiene la activación del enlace, lo configura para abrirse en una nueva ventana y luego hace clic programáticamente en él.
Puede ir un paso más allá y omitir la detención del clic original (y hacer que su código sea mucho más compacto) al intentar esto:
if (!e.target.hasAttribute("target")) {
e.target.setAttribute("target", "_blank");
}
Si estaba usando jQuery para abstraer la implementación de agregar un atributo de navegador cruzado, debería usar esto en lugar de e.target.setAttribute("target", "_blank"):
jQuery(event.target).attr("target", "_blank")
Es posible que deba volver a trabajarlo para que se ajuste a su caso de uso exacto, pero así es como me rasqué mi propio picor.
Aquí hay una demostración en acción para que te metas.
(El enlace en jsfiddle vuelve a esta discusión ... no necesita una nueva pestaña :))
target="_top"no se abre en una nueva ventana,target="_blank"sí.