Sei que este é um acordo feito e resolvido, mas eis o que estou usando para resolver o problema no meu aplicativo.
if (!e.target.hasAttribute("target")) {
e.preventDefault();
e.target.setAttribute("target", "_blank");
e.target.click();
return;
}
Basicamente, o que está acontecendo aqui é que eu corro para verificar se o link tem target=_blankatributo. Caso contrário, ele interrompe o acionamento do link, configura-o para abrir em uma nova janela e clica programaticamente nele.
Você pode dar um passo adiante e pular a parada do clique original (e tornar seu código muito mais compacto) ao tentar o seguinte:
if (!e.target.hasAttribute("target")) {
e.target.setAttribute("target", "_blank");
}
Se você estava usando o jQuery para abstrair a implementação da adição de um atributo entre navegadores, use isso em vez de e.target.setAttribute("target", "_blank"):
jQuery(event.target).attr("target", "_blank")
Pode ser necessário retrabalhá-lo para se adequar ao seu caso de uso exato, mas eis como eu arranhei minha própria coceira.
Aqui está uma demonstração em ação para você mexer.
(O link no jsfiddle volta a esta discussão. Não é necessária uma nova guia :))
target="_top"não abre em uma nova janela -target="_blank"faz.