4

我有 3rd 方加载的 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

4 回答 4

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),因为旧的浏览器版本似乎都可以很好地使用它。IE 因为 xss 而阻塞了 webkit 使用的 AJAX 调用。

另外,IE从来不支持jquery的unload函数,其他浏览器也不支持onbeforeunload,所以要区分大小写。这当然不是一个很好的解决方案,但它在大多数情况下都有效。

于 2010-04-20T16:33:42.847 回答
1

提醒那些尝试使用上述 Agmin 方法的人:当您使用 jQuery 的append()方法附加脚本标记时,内部 jQuery 接线用于jQuery.ajax()执行脚本,因此如果您要附加的脚本标记位于不同的域中,Same Origin策略将阻止脚本被执行。

于 2011-03-08T00:14:47.210 回答
0

据我记得,一些浏览器只接受文本字符串作为 onbeforeunload 结果。尝试更多类似的东西:

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

不确定,但这甚至可能适用于所有浏览器,但我现在只是猜测。

ps 另请参阅如何覆盖 OnBeforeUnload 对话框并将其替换为我自己的?

于 2010-04-17T02:48:09.337 回答
0

你应该看看easyXDM库

http://easyxdm.net/

我认为这将使您的工作轻松解决同源政策设置的限制

于 2010-10-23T15:07:35.417 回答