ссылка Отслеживание кликов не работает в браузере Safari - PullRequest
1 голос
/ 09 февраля 2011

У меня есть базовая HTML-страница, на которой есть ссылки, указывающие на другой сайт. Что я хочу сделать, это отслеживать клики. Я делаю это, отправляя вызов изображения в 0 пикселей на событие Click ссылки, не возвращая false при событии click.

То же самое отлично работает во всех браузерах, кроме Safari (в ОС Windows).

когда по ссылке щелкают, используя javascript, я задерживаю перенаправление, отправляю запрос изображения на сервер и регистрирую щелчок на стороне сервера. Я пытался увеличить задержку, но безуспешно ... Трекеры работают на gr8 во всех браузерах, кроме Safari, который вообще не отправляет запрос.

Я не знаю, почему, но, возможно, сафари ожидает выполнения полного js перед выполнением запроса, а после выполнения всего js оно перенаправляется ...

=============================================== ==========

<html>
  <head>
    <script type="text/javascript">
      function logEvent(){
    image = new Image(1,1);
    image.onLoad=function(){alert("Loaded");};
    image.onLoad=function(){alert("Error");};
    image.src='http://#path_to_logger_php#/log.php?'+Math.random(0, 1000) + '=' + Math.random(0, 1000);             
    pauseRedirect(500);
      }

      function pauseRedirect(millis){
    var date = new Date();
    var curDate = null;
    do {curDate = new Date();}
    while(curDate-date < millis);
      }
    </script>   
  </head>
  <body>        
    <a href="http://www.google.com" onclick="logEvent(); return true;">Site 1</a><br/>
    <a href="http://www.yahoo.com" onclick="logEvent(); return true;">Site 2</a><br/>
  </body>
</html>

=============================================== ==========

Код работает в chrome, firefox, т.е. и в Opera. Не работает только в Safari ..... никаких подсказок ....

1 Ответ

0 голосов
/ 09 июня 2011

У меня была такая же проблема со всеми браузерами WebKit. Во всех остальных случаях вам нужно всего лишь создать новый Image (). Src = "url", и браузер отправит запрос даже при переходе на новую страницу. WebKit остановит запрос перед его отправкой, когда вы сразу перейдете на новую страницу. Пробовал несколько хаков, которые внедряют изображение в документ и даже заставляют перерисовать через img.clientHeight. Я действительно не хочу использовать event.preventDefault, так как это вызывает много головной боли, когда ссылка имеет target = "_ blank", отправку формы и т. Д. Завершается использованием синхронного XmlHttpRequest для браузеров, поддерживающих Cross Origin Resource Sharing , поскольку он отправит запрос на сервер, даже если вы не прочитали ответ. Синхронный запрос имеет нежелательный побочный эффект - блокирует UI-поток в ожидании ответа, поэтому, если сервер работает медленно, страница / браузер блокируется, пока не получит ответ.

var supportsCrossOriginResourceSharing = (typeof XMLHttpRequest != "undefined" && "withCredentials" in new XMLHttpRequest());
function logEvent() {
    var trackUrl = 'http://#path_to_logger_php#/log.php?'+Math.random(0, 1000) + '=' + Math.random(0, 1000);
    if(supportsCrossOriginResourceSharing) {
        xhrTrack(trackUrl);
    } else {
        imgTrack(trackUrl);
    }
}

function xhrTrack(trackUrl) {
    var xhr = new XMLHttpRequest();
    xhr.open("GET", trackUrl, false);
    xhr.onreadystatechange = function() {
        if(xhr.readyState >= this.OPENED) xhr.abort();
    }
    try { xhr.send() } catch(e) {}
}

function imgTrack(trackUrl) {
    var trackImg = new Image(1,1);
    trackImg.src = trackUrl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...