Почему состояние готовности документа меняется с «завершено» на «загрузка»?

Пожалуйста, взгляните на следующий код:

this.detachedWin = window.open(window.origin + "/@/tab","Detached","menubar=0,toolbar=0,personalbar=0,status=0");
  
this.doc = this.detachedWin.document;

setInterval(() => {
  console.info(this.doc === this.detachedWin.document,this.detachedWin.document.readyState);
  this.doc = this.detachedWin.document;
}, 10);

JSFiddle

Если вы посмотрите на свой журнал консоли, вы увидите что-то вроде этого:

Я не понимаю, почему состояние готовности документа в первый раз «завершено» и по какой причине после этого оно меняется на загрузку? Я ожидаю, что состояние готовности будет «загружаться» в первый раз.

Что-то не так с тестовым примером jsFiddle, получая неопределенный документ.

lortschi 22.12.2020 12:28

@lortschi Я дважды проверил это. Он работает так, как ожидалось. Пожалуйста, попробуйте открыть его в Chrome, нажмите F12 и посмотрите на консоль. Не смотрите на встроенную консоль JSFiddle.

Reza 23.12.2020 10:08
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
778
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сначала «завершение» происходит с пустым окном, а затем оно меняет местоположение на предоставленный URL-адрес.

Обратите внимание, что удаленные URL-адреса не будут загружаться сразу. Когда окно.открыть() возвращается, окно всегда содержит about:blank. Фактическая выборка URL откладывается и начинается после текущего блока скрипта заканчивает выполнение. Создание окна и загрузка ссылочный ресурс выполняется асинхронно.

developer.mozilla.org

Упрощенный процесс открывания окон

  1. окно.открыть()
  2. Сразу загрузился, ибо грузить нечего: "загружается"
  3. Сразу стал интерактивным, потому что он пустой: "интерактивный"
  4. Пустое окно готово: "завершено"
  5. Установить window.location явно или неявно
  6. Перенаправление на URL: "загрузка"
  7. Окно становится интерактивным: "интерактивный"
  8. Окно готово: "завершено"

Полный поток со всеми этапами открывания окна вы можете найти в спецификации.

Чтобы увидеть, как это работает, посмотрите пример:

const openMe = () => { 
  this.detachedWin = window.open("", "Detached","menubar=0,toolbar=0,personalbar=0,status=0");

  setTimeout(() => {
    console.info("loading happen now")
    this.detachedWin.location = window.origin + "/@/tab"
  }, 1000);

  this.doc = this.detachedWin.document;
  setInterval(() => {
    console.info(this.doc === this.detachedWin.document, this.detachedWin.document.readyState);
    this.doc = this.detachedWin.document;
  }, 10);
}
<button onclick = "openMe()">Open window</button>

Таким образом, флаг readystate бесполезен, поскольку вы не знаете, какой документ загружен, пустой или исходный документ. Я думаю, что лучший способ — определить ваш флаг как onload событие вашего документа и работать с ним.

Reza 09.01.2021 14:21

Да, вы правы. Не стесняйтесь пометить этот вопрос как решенный

Alexandr Tovmach 09.01.2021 19:59

Другие вопросы по теме