Проблема завершения загрузки 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 шт):

Автор решения: Igor

Где-то в другом месте (но после Вашего window.onload = ...) есть другой код, который делает то же самое (window.onload = ...) и затирает Ваш window.onload обработчик. Поэтому надо использовать

window.addEventListener("load", function(){
  console.log("Страница загружена");
});
→ Ссылка