Почему использование target="_blank" приводит к сбою Javascript?
У меня есть несколько ссылок, которые используют атрибут 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();
}
... тогда не удается отследить цель.
Может кто-нибудь сказать мне, почему это может быть, и что я должен сделать, чтобы обойти эту проблему? К вашему сведению, я использую Prototype для Javascript.
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>
При нажатии на ссылку открывается новое окно и обновляется div с количеством нажатий на ссылку. Протестировано это в IE6, IE7, FF2, FF3.5, Chrome 2, Chrome 3, Opera 9.
Возможно, победитель прав, 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>
Следующая лучшая вещь - это иметь страницу отслеживания ссылок и направлять все внешние ссылки через эту страницу.