Пожалуйста, взгляните на следующий код:
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);
Если вы посмотрите на свой журнал консоли, вы увидите что-то вроде этого:
Я не понимаю, почему состояние готовности документа в первый раз «завершено» и по какой причине после этого оно меняется на загрузку? Я ожидаю, что состояние готовности будет «загружаться» в первый раз.
@lortschi Я дважды проверил это. Он работает так, как ожидалось. Пожалуйста, попробуйте открыть его в Chrome, нажмите F12 и посмотрите на консоль. Не смотрите на встроенную консоль JSFiddle.
Сначала «завершение» происходит с пустым окном, а затем оно меняет местоположение на предоставленный URL-адрес.
Обратите внимание, что удаленные URL-адреса не будут загружаться сразу. Когда окно.открыть() возвращается, окно всегда содержит about:blank. Фактическая выборка URL откладывается и начинается после текущего блока скрипта заканчивает выполнение. Создание окна и загрузка ссылочный ресурс выполняется асинхронно.
Полный поток со всеми этапами открывания окна вы можете найти в спецификации.
Чтобы увидеть, как это работает, посмотрите пример:
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
событие вашего документа и работать с ним.
Да, вы правы. Не стесняйтесь пометить этот вопрос как решенный
Что-то не так с тестовым примером jsFiddle, получая неопределенный документ.