2011-02-09 165 views
1

我有一个基本的html页面,其中有指向不同站点的链接。我想要做的就是跟踪点击次数。我这样做是通过在链接的Click事件上发送一个0像素图像调用而不在点击事件上返回false。链接点击跟踪在Safari浏览器上不起作用

对于除Safari之外的所有浏览器(在Windows操作系统上),这同样工作正常。

当使用javascript点击链接时我延迟重定向并发送图像请求到服务器并记录点击服务器端。我试图增加延迟,但没有成功......追踪器在除Safari之外的所有浏览器上工作gr8,它根本没有发送请求。

我不知道为什么,但可能它对于整个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 2011-02-09 13:54:52

回答

0

我对所有WebKit浏览器都有同样的问题。在所有其他情况下,您只需要执行新的Image()。src =“url”,即使导航到新页面,浏览器也会发送请求。 WebKit会在请求立即导航到新页面之前停止请求。尝试了几次将图像注入到文档中的黑客,甚至通过img.clientHeight登录到force a re-paint。我真的不想使用event.preventDefault,因为当一个链接有target =“_ blank”,表单提交等时会引起很多头痛。最后,使用支持Cross Origin Resource Sharing的浏览器的同步XmlHttpRequest,因为它会发送即使您不读取响应,也会向服务器发送请求。同步请求具有在等待响应时锁定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; 
}