Проблема завершения загрузки HTML-страницы при вызове Ajax-запроса с использованием XMLHttpRequest-объекта
Код на чистом JS.
Для запроса данных с сервера вызывается AJAX-функция с использованием XMLHttpRequest-объекта, запрос нормально завершается со статусом 200 (ОК), и все данные отлично переданы, обработаны и представлены в HTML-странице.
Request = new XMLHttpRequest();
...
// конфигурирация запроса
r_method = "POST"
Request.open(r_method, "/url/", true);
// Проверяем, если требуется сделать POST-запрос
if (r_method.toLowerCase() == "post") {
// Если это POST-запрос устанавливаем заголовки:
Request.setRequestHeader("Content-Type", "application/json; charset=utf-8");
// Посылаем запрос
Request.send(JSON.stringify({'data': data}));
}
...
if (Request.readyState == 4) {
// Передаем управление обработчику пользователя
console.log("Статус запроса: " + Request.status + ", текст статуса:" + Request.statusText); // 200, ОК
r_handler(Request);
}
Обработчик r_handler(Request) извлекает из запроса данные, и далее сам XMLHttpRequest-объект не используется:
r_handler(Request) {
serv_response = eval('('+ Request.responseText +')');
...
// Request.abort(); // результат не меняется - признака конца загрузки HTML-страницы нет
}
Однако на этой же странице другой JS скрипт завязан на конструкции "window.onload" и всегда находится в ожидании конца загрузки страницы.
console.log("Скрипт работает");
window.onload = function () {
console.log("Страница загружена");
}
Было однозначно установлено, что проблема именно в том, что HTML-страница ожидает конца загрузки, т.к. без конструкции window.onload всё отлично работает.
Пробовалось закрыть соединение после получения данных с помощью метода .abort(), но ничего не поменялось.
Без использования скрипта с XMLHttpRequest-объектом признак завершения загрузки на странице корректно срабатывает!
Что это за ситуация, и как всё-таки нормально достигнуть признака конца загрузки HTML-страницы в данном случае?
Ответы (1 шт):
Где-то в другом месте (но после Вашего window.onload = ...) есть другой код, который делает то же самое (window.onload = ...) и затирает Ваш window.onload обработчик. Поэтому надо использовать
window.addEventListener("load", function(){
console.log("Страница загружена");
});