如何在页面卸载时可靠地发送请求跨域和跨浏览器

时间:2010-04-17 00:35:07

标签: javascript jquery xss onbeforeunload

我有第三方加载的javascript代码。 javascript会跟踪多个指标,当用户退出页面时,我想将指标发送回我的服务器。

由于某些浏览器(如IE)中的XSS检查,我无法进行简单的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(); }
        );
    }

如果我使用window.onbeforeunload,FF会中止对“test_url”的请求,而IE8不能与jquery的unload()一起使用。如果任意test_url设置代码太长,IE8也无法工作,尽管如果IE8立即附加到DOM,IE8似乎工作正常。

有没有更好的方法来解决这个问题?不幸的是,这确实需要在用户离开页面时执行。

4 个答案:

答案 0 :(得分: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,因此必须使用它们。这当然不是一个漂亮的解决方案,但它大部分时间都有效。

答案 1 :(得分:1)

对于那些试图使用上述Agmin方法的人来说:当您使用jQuery的append()方法附加脚本标记时,内部jQuery连接使用jQuery.ajax()来执行脚本,因此如果脚本标记您要追加的是另一个域,同源策略将阻止脚本执行。

答案 2 :(得分: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?

答案 3 :(得分:0)

你应该看看easyXDM库

http://easyxdm.net/

我认为这将使您的工作变得轻松,因为同源政策

设置了限制