Por que usar target = “_ blank” causa Javascript a falhar?
-
06-07-2019 - |
Pergunta
Eu tenho um monte de links que usam um target = "_ blank" atributo para abrir em uma nova janela. Eu quero anexar rastreamento objetivo do Google Analytics para cliques desses links.
Para fazer isso, eu tentei ligar um atributo onclick = "pageTracker._trackPageview ( '/ evento / saída')" para as ligações.
Mas descobri que para as ligações com um target = "_ blank" atributo, evento do Javascript onclick fica ignorado. Assim, o objetivo não é gravado. Em outras palavras, este link registra com sucesso a meta:
<a href="http://www.yahoo.com" onclick="pageTracker._trackPageview('/event/outgoing')">Click me</a>
Mas isso não:
<a href="http://www.yahoo.com" target="_blank" onclick="pageTracker._trackPageview('/event/outgoing')">Click me</a>
Alguém sabe por que isso pode estar ocorrendo? Assumindo que não há uma solução fácil, eu suponho que vou ter que usar o Javascript para resolver o problema. O código a seguir registra com sucesso um objetivo (mas não abre o link):
function attach_goal_tracking() {
var links = document.getElementsByClassName("buyTicketsLink");
for(var i=0; i<links.length; i++) {
links[i].onclick = record_goal;
}
}
function record_goal(e) {
e.stop();
pageTracker._trackPageview('/event/outgoing');
}
Mas quando eu adicionar à função record_goal para abrir o link ...
function record_goal(e) {
e.stop();
pageTracker._trackPageview('/event/outgoing');
var newWindow = window.open(this.getAttribute('href'), '_blank');
newWindow.focus();
}
... então ele não conseguir acompanhar o objetivo.
Alguém pode me dizer por que isso pode ser, e o que devo fazer para contornar este problema? FYI Estou usando Prototype para JavaScript.
Solução
Pode haver um problema com bloqueadores de pop-up (estou pensando Googlebar) parar a janela de abertura, e (com a presença de onclick
) impedindo o código onclick
de execução. Por exemplo, ver este e este emite som semelhante outras pessoas estão tendo.
Ou pode ser simplesmente que o código de manipulador de clique está jogando um erro que, em seguida, impede que o resto do código de concluir. Ver o meu comentário à sua pergunta re como você está ligando os eventos. e.stop()
pode estar falhando no IE.
A sua hipótese, porém, é falsa. target="_blank"
e onclick="..."
fazer um trabalho em conjunto muito bem.
Testcase no ponto: http://jsbin.com/anahe (add /edit
para a url para editar o código). Pode ser necessário desligar o bloqueador (s) pop-up :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Sandbox</title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<script>var clickCount= 0;</script>
</head>
<body>
<a href="http://www.google.com" target="_blank" onclick="document.getElementById('dbg').innerHTML = ++clickCount">
open new
</a>
<div id="dbg"></div>
</body>
</html>
Ao clicar no link abre uma nova janela e atualiza o div com o número de vezes que o vinculadas foi clicado. Testado esta no IE6, IE7, FF2, FF3.5, Chrome 2, Chrome 3, Opera 9.
Outras dicas
É possível, Victor é certo o e.stop () é uneccessary, posso confirmar que o código a seguir com êxito abre uma nova guia, e de forma assíncrona alertas na guia antiga (consequentemente tornando-se recuperar o foco).
<a href="" target="_blank">reload</a>
<script>
var as = document.getElementsByTagName('a');
for (var i = 0; i < as.length; i++) {
var a = as[i];
a.onclick = function(e) {
setTimeout(function() {
alert('hi hi');
}, 1000);
}
}
</script>
A próxima melhor coisa é ter uma página link de monitoramento e via todos os seus links externos através dessa página.