2010-04-17 103 views
4

我有JavaScript代碼,由第三方加載。 javascript記錄了很多度量標準,當用戶退出頁面時,我想將度量標準發送回我的服務器。如何可靠地發送請求跨域和跨頁面瀏覽器卸載

由於XSS在某些瀏覽器中檢查,如IE,我不能做一個簡單的jquery.ajax()調用。相反,我使用jquery將圖像src附加到頁面上。下面的代碼,通過瀏覽器套管:

function record_metrics() { 
     //Arbitrary code execution here to set test_url 
     $esajquery('#MainDiv').append("<img src='" + test_url + "' />"); 
    } 

    if ($esajquery.browser.msie) { 
     window.onbeforeunload = function() { record_metrics(); } 
    } else { 
     $esajquery(window).unload(
      function(){ record_metrics(); } 
     ); 
    } 

FF中止請求「test_url」如果我使用window.onbeforeunload和IE8不jQuery的卸載工作()。 IE8也無法工作,如果任意test_url設置代碼太長,雖然IE8似乎工作正常,如果它立即附加到DOM。

有沒有更好的方法來解決這個問題?不幸的是,這真的需要在用戶離開頁面時執行。

回答

0

從我記得,一些瀏覽器只接受onbeforeunload結果的文本字符串。嘗試更像這樣的:

jQuery(window).bind('beforeunload', function() { record_metrics(); return ''; }); 

不知道,但這可能適用於所有瀏覽器,但我只是在這一點上猜測。

p.s.又見How can I override the OnBeforeUnload dialog and replace it with my own?

+0

用beforeunload綁定窗口並返回一個空字符串會導致「你確定要導航離開這個頁面嗎?」提示,這是我不能擁有的,也無法完成/完成record_metrics調用。簡單地不返回值也不起作用。 – Agmin 2010-04-19 16:32:05

1

爲後人的緣故,這裏是我落得這樣做:

if ($.browser.msie) { 
    window.onbeforeunload = function() { $('#div1').append("<img src='record_call' />"); 
} else { 
    $(window).unload(
     if ($.browser.webkit) { 
      $.ajax(url:record_call, async:false); 
     } else { 
      $('#div1').append("<script src='record_call' />"); 
     } 
    ); 
} 

我發現,IE工程追加的IMG,而不是一個腳本,可能是因爲腳本是更大量資源,而且它削減試圖加載它之前。對於webkit,添加腳本有時可行,但添加圖像似乎從未奏效。最後,我默認使用腳本(主要用於FF),因爲舊版本的瀏覽器似乎都很適合。由於xss,IE會阻止webkit使用的AJAX調用。

另外,IE從不使用jquery的卸載功能,而其他瀏覽器不能與onbeforeunload一起使用,所以必須將它們放在一起。這當然不是一個漂亮的解決方案,但它大部分時間都適用。

0

你應該看看easyXDM庫

http://easyxdm.net/

我想它會讓你的工作變得容易關於由同源策略

1

的就地設置的限制,對於那些試圖單挑使用上面的Agmin的方法:當您使用jQuery的append()方法追加腳本標記時,內部jQuery配線使用jQuery.ajax()來執行腳本,因此如果您要追加的腳本標記位於不同的域中,則相同原點策略將阻止腳本從EXE cuted。