Что сработало:
Мой код теперь работает во всех браузерах и выглядит так:
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
на false в $.post()
не показалась мне достаточной для его работы. Мне пришлось установить этот параметр в $.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 не хватает времени, чтобы полностью завершить вызов, что немного портит остальную часть моей программы. Способ, который у меня есть, это добавить оператор возврата, например, так:
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? Я немного осмотрел сеть, но пока не нашел того, что мне подходит.
Надеюсь, я был достаточно ясен в своем вопросе.
Edit:
Подумал, может, мне стоит добавить свой 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;
?>