Почему используется target = & # 8220; _blank & # 8221; вызвать сбой JavaScript?

StackOverflow https://stackoverflow.com/questions/1629158

Вопрос

У меня есть несколько ссылок, которые используют 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>

Следующая лучшая вещь - это создать страницу отслеживания ссылок и направить все внешние ссылки через эту страницу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top