我有第三方加载的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似乎工作正常。
有没有更好的方法来解决这个问题?不幸的是,这确实需要在用户离开页面时执行。
答案 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)