Почему используется target = & # 8220; _blank & # 8221; вызвать сбой JavaScript?
-
06-07-2019 - |
Вопрос
У меня есть несколько ссылок, которые используют target = " _blank " атрибут открывать в новом окне. Я хочу прикрепить отслеживание целей Google Analytics к кликам по этим ссылкам. Р>
Для этого я попытался прикрепить onclick = " pageTracker._trackPageview ('/ event / outgoing') " приписать ссылки. Р>
Но я обнаружил, что для ссылок с целью = " _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.
Решение
Возможно, возникла проблема с блокировщиками всплывающих окон (я думаю, Googlebar), когда окно не открывалось и (при наличии onclick
) не позволяло onclick
code от бега. Например, см. этот и это похожие проблемы, возникающие у других людей.
Или это может быть просто из-за того, что код обработчика кликов выдает ошибку, которая не позволяет завершить выполнение остальной части кода. Смотрите мой комментарий к вашему вопросу о том, как вы связываете события. 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>
Следующая лучшая вещь - это создать страницу отслеживания ссылок и направить все внешние ссылки через эту страницу.