什么有效:
我的代码现在适用于所有浏览器,如下所示:
window.onbeforeunload = function(){
$.ajaxSetup({
async: false
});
$.post('./archive_onBeforeUnload.php?', {contact_id: contact_id}, function(){
}).error(function(xhr, textStatus, error){
console.log(xhr.statusText);
console.log(textStatus);
console.log(error);
});
}
在async
内将$.post()
设置为false似乎不足以让它为我工作。我必须在$.ajaxSetup
中设置该设置才能在所有浏览器中使用。
我的项目是一种使用HTML和PHP创建的聊天程序。我遇到的问题是如果这个人使用顶部的X按钮关闭窗口,我需要运行一些PHP才能使我的程序仍能正常运行。所以我做了一些搜索,最后得到了这段代码:
window.onbeforeunload = function(){
$.post('./archive_onBeforeUnload.php?', {contact_id: contact_id}, function(){
}).error(function(xhr, textStatus, error){
console.log(xhr.statusText);
console.log(textStatus);
console.log(error);
});
}
这会调用archive_beforeUnload.php并运行我需要的少量PHP。在FireFox,Safari和Chrome中运行得很好但在IE中我似乎有问题。似乎没有足够的时间让IE实际完全完成调用,这会稍微扰乱我的程序的其余部分。我有一个方法是使用像这样添加一个return语句:
window.onbeforeunload = function(){
$.post('./archive_onBeforeUnload.php?', {async: 'true', cache: 'false', contact_id: contact_id}, function(){
}).error(function(xhr, textStatus, error){
console.log(xhr.statusText);
console.log(textStatus);
console.log(error);
});
return 'I need to fix the timer here. Without this it doesn\'t work in IE';
}
这似乎给了IE足够的时间来实际完成AJAX调用。问题是,它会在窗口每次关闭之前创建一个确认窗口,这会让用户感到烦恼。有没有什么方法可以让我在IE中工作而不需要return语句?我在网上看了很多,但还没找到适合我的东西。
希望我在我的问题上已经足够清楚了。
编辑:
我想我应该添加我的PHP脚本:
<?php
session_start();
require_once('client_init.php');
$sqlRequeue = 'UPDATE S2G_CHAT_TRAVELLER_QUEUE SET';
$sqlRequeue .= ' isOpen = 1';
$sqlRequeue .= ' WHERE contactID='.$contact_id;
$resRequeue = $conn_dd->query($sqlRequeue);
$resRequeue->close;
$_SESSION['s2g_chat_messages_shown'] = $default_messages_shown;
?>
答案 0 :(得分:1)
我认为问题是$.post()
是异步的,所以函数在完成之前就会返回。
您似乎可以使用$.async()
功能do the same call synchronously。