为什么使用target="_blank"会导致Javascript失效?

4

我有一堆链接,它们使用target="_blank"属性在新窗口中打开。我想将Google Analytics目标跟踪附加到这些链接的点击上。

为此,我尝试将onclick="pageTracker._trackPageview('/event/outgoing')"属性附加到链接上。

但是我发现,对于带有target="_blank"属性的链接,Javascript onclick事件会被跳过。因此目标未被记录。换句话说,这个链接成功记录了目标:

<a href="http://www.yahoo.com" onclick="pageTracker._trackPageview('/event/outgoing')">Click me</a>

但这个并不行:
<a href="http://www.yahoo.com" target="_blank" onclick="pageTracker._trackPageview('/event/outgoing')">Click me</a>

有没有人知道为什么会出现这种情况?假设没有简单的解决方案,我想我必须使用Javascript来解决这个问题。以下代码成功记录了一个目标(但不打开链接):

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');
}

但是当我添加record_goal函数以打开链接时...
function record_goal(e) {
    e.stop();
    pageTracker._trackPageview('/event/outgoing');
    var newWindow = window.open(this.getAttribute('href'), '_blank');
    newWindow.focus();
    }

如果这个跟踪目标失败了,有人能告诉我可能是为什么,以及我应该怎么解决这个问题吗?顺便说一下,我正在使用Javascript的Prototype库。


没有 e.stop() 会发生什么? - Victor
没有e.stop(),目标就不会被记录下来。 - Jack7890
我知道你说你正在使用Prototype库,虽然e.stop()是在Prototype事件对象上有效的方法调用,但你绑定到click事件的方式完全绕过了Prototype事件绑定模型(即Event.observe)在IE中。供参考。 - Crescent Fresh
使用onmousedown代替onclick怎么样? - mangokun
2个回答

2
可能会出现弹出窗口阻止程序(我想是Googlebar)打开窗口,同时存在onclick的情况下,会防止onclick代码运行。例如,其他人遇到的类似问题,请参见此处此处

或者仅仅是点击处理程序代码发生错误,然后阻止其余代码完成。请参见您的问题中如何绑定事件的我的评论。e.stop()在IE中可能失败。

但是,您的假设是错误的。target="_blank"onclick="..."可以很好地配合使用。

测试用例:http://jsbin.com/anahe(将/edit添加到URL以编辑代码)。您可能需要关闭弹出窗口拦截器

<!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>

点击链接会打开一个新窗口并更新

中链接被点击的次数。在IE6、IE7、FF2、FF3.5、Chrome 2、Chrome 3和Opera 9中测试过。


0

这是可能的,Victor 是正确的,e.stop() 是不必要的。我可以确认以下代码成功地打开了一个新标签页,并异步地在旧标签页上发出警报(因此使其重新获得焦点)。

<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>

接下来最好的方法是拥有一个链接跟踪页面,并通过该页面路由所有外部链接。


我尝试过这个。不幸的是,即使我使用setTimeout(),目标也没有被跟踪。 - Jack7890

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接