Итак, у меня есть интересная ошибка, которую я нашел в своем коде.Во-первых, сам код:
$('#form').on('submit', function(event) {
event.preventDefault();
// Configure Ajax call only if the user is online at the time of submit event
if (navigator.onLine) {
// Tab closing detection event enable - implemented to stop the user from accidentaly closing the tab during upload
$(window).on('beforeunload', function() {
return "Closing message"
})
var post_data = new FormData($("#form")[0]);
xhr = $.ajax({
xhr: function() {
var xhr = new window.XMLHttpRequest();
var started_at = new Date();
xhr.upload.addEventListener("progress", function(evt) {
if (!navigator.onLine && xhr.readyState < 4) {
// sub-routine making sure that the user is online during upload start
xhr.abort()
alert("Network connection was lost. Data upload has been aborted, and data already transfered might have been corrupted. Please restore your connection and try again.")
} else {
// Executed if the user remains online
transferOn = true
}
}, false);
xhr.upload.addEventListener("abort", function() {
// Instructions re-enabling the form after an Ajax abort event was executed
formUnlock('#submit_button', serial_id, false)
disableTags(false)
});
return xhr;
},
url: '#',
type: "POST",
data: post_data,
processData: false,
contentType: false,
dataType: "json",
timeout: 1500000, // timeout of 25 minutes for a request - to be tweaked to be in line with Apache settings!
error: function(xhr, status) {
xhr.abort()
transferOn = false
// Check if the source of error is an Ajax timeout event, if not then
// check if xhr.status is defined in $.ajax.statusCode
// if true, return false to stop this function
if (status === 'timeout') {
alert("Data transfer time has exceeded 25 minutes. A timeout event has been triggered.")
} else if (typeof this.statusCode[xhr.status] != 'undefined') {
return false;
} else {
// else print out this alert
alert("Error code " + xhr.status + " returned by the server.\n\nTHE UPLOAD ATTEMPT WAS NOT SUCCESSFUL!\n\nPlease try again or contact website's support.");
}
},
statusCode: {
0: function() {
alert("Error code 0: AJAX request was cancelled.");
},
404: function() {
alert("Error code 404: Page not found.");
},
408: function() {
alert("Error code 408: Request Timeout.");
},
413: function() {
alert("Error code 413: Request Entry Too Large.");
},
500: function() {
alert("Error code 500: Internal server error");
}
},
success: function(response) {
// Lift of the transferOn flag, which prevents main control loop (enabling PR/SR-file/tag/text input fields sequentially)
transferOn = false
}
});
} else {
alert('You are offline - file transfer cannot be initiated. Please check your connection and try again.')
}
})
Идея состоит в том, что при превышении времени ожидания Ajax он должен выполнять следующие действия в этом точном порядке: 1) прервать XHR 2) установить передачу вклфлаг false 3) выполнить функцию formUnlock () 4) в зависимости от состояния ошибки, вызвать одно из окон предупреждения 5) выполнить содержимое statusCode 6) сделать все остальное.
Этот порядок выполняется Internet Explorer, ноне Хромом.Похоже, что Chrome выполняет его следующим образом:
4) в зависимости от состояния ошибки, вызовите одно из окон предупреждений. 5) Выполните содержимое statusCode. 1) Прервите XHR. 2) Установите флаг передачи в значение false 3) Выполните formUnlock () функция 6) Сделайте все остальное.
Я действительно озадачен этим и приветствую чье-либо предложение относительно того, что я делаю неправильно.