2011-09-15 42 views
0
function log(name, value) 
{ 
    mylog.push({'name':name, 'value':value}); 
} 

function flush() 
{ 
    for (i = 0 ; i < mylog.length ; i++){ 
     url_str += '&n[]=' + mylog[i].name + '&v[]=' + mylog[i].value; 
    } 
    url_str += '&r='+Math.floor(Math.random() * 100000); 

    var img = new Image(); 
    var url = 'http://somedomain.com/pixel.php?' + url_str; 
    img.src = url; 
} 

if (window.attachEvent) 
    window.attachEvent('onunload', flush); 
else if (window.addEventListener) 
    window.addEventListener('unload', flush, false); 

我正在研究一些跟蹤用戶交互以在頁面上查找熱點的代碼。它大部分已經完成,可以在大多數瀏覽器上運行,但是我目前正在使用Safari 5.0.5/Mac 10.6(順便說一下,它也可以在Windows XP上使用Safari 5.0.1進行復制)。給我帶來困難的部分是頁面傳輸期間的鏈接點擊。例如,下面的代碼需要我someotherpage.html:Safari在頁面卸載前不讓函數完成?

<form onclick="log('LINK_CLICKED', 'some other page'); this.submit();" action="someotherpage.html">Some other page</form> 

該網站帶我在所有的瀏覽器someotherpage.html,但只有Safari瀏覽器5.0.5/Mac的10.6不會在日誌中顯示LINK_CLICKED 。在Safari檢查器中進行了一些控制檯檢查之後,我發現Safari出現「加載資源失敗」錯誤。我懷疑這是因爲雖然可以調用URL,但瀏覽器已決定繼續前進(?)。

無論如何,我已經嘗試beforeunload事件並使用setTimeout來延遲頁面卸載。我是 考慮完全改變HTML格式,但這將是一個相當大的努力。儘管如此,除非有人忽視我的注意力,否則我會接受。有關如何在Safari 5.0.5(Mac 10.6)上運行的建議?

回答

1

我想你只是遇到了一個競爭條件,可以緩解與釘合像素負載的回調。

function log(name, value, callback) 
{ 
    mylog.push({'name':name, 'value':value, 'callback':callback}); 
} 


function flush() 
{ 
    for (i = 0 ; i < mylog.length ; i++){ 
     url_str += '&n[]=' + mylog[i].name + '&v[]=' + mylog[i].value; 
    } 
    url_str += '&r='+Math.floor(Math.random() * 100000); 

    var img = new Image(); 
    img.onload = logReady; 
    var url = 'http://somedomain.com/pixel.php?' + url_str; 
    img.src = url; 
} 

function logReady() 
{ 
    for (i = 0 ; i < mylog.length ; i++){ 
     mylog[i].callback(); 
    } 
} 



<form onclick="log('LINK_CLICKED', 'some other page', function() { form.submit(); });" action="someotherpage.html">Some other page</form> 
+0

謝謝!我使用了你的解決方案和http://stackoverflow.com/questions/4945764/link-click-tracking-does-not-work-on-safari-browser。通過日誌功能發送回調,並讓CORS進行呼叫。有權衡,但它們或多或少都可以忍受。 – Jerico