Почему использование target = "_ blank" приводит к сбою Javascript? - PullRequest
4 голосов
/ 27 октября 2009

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

2 голосов
/ 28 октября 2009

Возможно, проблема с блокировщиками всплывающих окон (я думаю, 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.

0 голосов
/ 27 октября 2009

Возможно, победитель прав, 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>

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

...