2011-02-09 4 views
1

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

То же самое работает во всех браузерах, кроме 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, ie и Opera. Не работает на Safari только ..... любые подсказки ....

+0

Вы ожидаете, что изображение закончит загрузку или сделает что-то вроде 'setTimeout()'? Можем ли мы увидеть код? – alex

+0

Благодарим за замораживание браузера пользователей за 500 миллисекунд. Эмулирующий сон в JS ... без комментариев. PS: Я также думаю, что Safari ждет, пока JS закончит, прежде чем он выполнит запрос. Вы должны изменить свой код на асинхронный запрос AJAX вместо изображения thingadong (то есть, если ваш счетчик находится на одном сервере). –

+0

код добавлен ... :) Мой счетчик php находится на другом сервере и его необходимо хранить там. ** ЛЮБОЙ ** другие предложения .... –

ответ

0

У меня была такая же проблема со всеми браузерами WebKit. Во всех остальных вам нужно только создать новый Image(). Src = "url", и браузер отправит запрос, даже если перейдет на новую страницу. WebKit остановит запрос до его отправки при переходе на новую страницу сразу после. Попробовал несколько хаков, которые вставляли изображение в документ и даже force a re-paint через img.clientHeight. Я действительно не хочу использовать event.preventDefault, поскольку это вызывает много головных болей, когда ссылка имеет target = "_ blank", form submit и т. Д. Закончилось использование синхронного 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; 
} 
Смежные вопросы