我已经在卸载事件上运行 ajax-calls约一年了。
它一般在FF和IE中工作但不是100%,我不能说它什么时候失败了。
我通过写下bodytag注册活动:
onunload的= “....”
我在FF4中收到错误消息,因为卸载事件也想在刚刚卸载的页面的div标签中写入。通过使ajax例程在目标div的id为'dummy'时不写入任何内容来解决此问题
我不是AJAX的专家,但以下代码有效:
http://yorabbit.info/e-dog.info/tmp/ajax_ex.php(链接是文本页面)
(使用以下参数调用ajaxfunction2:filename,PHP的queryString,更新期间在目标div中显示的字符串,目标div的名称)
我没有在FF错误控制台中收到任何错误消息,并且IE9正常工作。 有什么方法可以让它在FF中运行吗?我刚开始尝试FF4,但我的印象是它的效果不如FF3。
感谢。
(我正在旅行,而且没有可能立即回复,但我非常感谢建议并会在适当的时候回复)
编辑: 我更好地补充一下: 我在卸载时进行的AJAX调用仅发送一些数据(用户在页面上停留的时间)到PHP-MySQL服务器
答案 0 :(得分:1)
我不知道这里发生了什么,但Firefox 4对卸载的工作方式做了显着的改变:例如,如果你在链接点击事件期间做一个alert(),它将不再冻结页面,但是无论如何加载新位置。也许这是类似的。
但是,如果Ajax调用在任何浏览器中无法同步,则无法保证完成Ajax调用 - 在页面关闭之前,请求可能会也可能不会返回响应。这是否有效,以及用户的网络速度。
首先尝试使用同步请求,如下所示:How does jQuery's synchronous AJAX request work?
这通常可以保证请求回来。但是,谨慎使用非常 - 页面卸载时的阻塞行为对用户来说非常烦人,甚至冻结浏览器。
答案 1 :(得分:1)
我建议使用jQuery而不是自己跟踪浏览器更改。
<强>解决方案:强>
在此处查找工作示例:http://jsfiddle.net/ezmilhouse/4PMcc/1/
假设您的内部链接是相对设置的,因此您的外部链接以“http”开头:
<a href="http://google.com">Leave ...</a>
<a href="/home.html">Stay ...</a>
你可以通过jQuery事件劫持'a'标签并要求用户确认离开(如果是外部链接)。在'ok'的情况下,您启动'onleave'ajax调用(async = true)并将用户重定向到外部链接:
$('a').live('click', function(event){
// cache link
var link = $(this).attr('href');
// check if external link (assuming that internal links are relative)
if (link.substr(0,4) === "http") {
// prevent default a tag event
event.preventDefault();
// popup confirm message
var reply = confirm('Do you really want to leave?');
if (reply) {
var url = 'http:mydomain.com/ajax.php';
var data = {'foo': 'bar', 'fee':'bo'};
// kick off your 'onleave' ajax call
// forced to be synchronous
$.ajax({
type: "POST",
async: false,
url: url,
data: data,
success: function( data ) {
// ok case: leave page, cached link
window.location.href = link;
}
});
}
return false;
}
});