首页 文章

链接点击跟踪在Safari浏览器上不起作用

提问于
浏览
1

我有一个基本的html页面,其中包含指向不同站点的链接 . 我想要做的是跟踪点击次数 . 我是通过在链接的Click事件上发送0像素图像调用而不在点击事件上返回false来实现的 .

除了Safari(在Windows操作系统上)之外,所有浏览器都能正常工作 .

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

我不知道为什么,但可能它的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>
<a href="http://www.yahoo.com" onclick="logEvent(); return true;">Site 2</a>
</body> </html>

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

代码适用于chrome,firefox,ie和Opera . 仅适用于Safari .....任何线索....

1 回答

  • 0

    我对所有WebKit浏览器都有同样的问题 . 在所有其他人中,您只需要执行新的Image() . src = "url",即使导航到新页面,浏览器也会发送请求 . WebKit将在您刚刚导航到新页面之前停止请求 . 尝试了几个将图像注入文档的黑客,甚至通过img.clientHeight force a re-paint . 我真的不想使用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;
    }
    

相关问题