#javascript
Вопрос:
Учитывая следующий HTML-код с небольшим фрагментом JS:
<html>
<head>
<title></title>
</head>
<body>
<script>
const iframeEl = document.createElement("iframe");
document.body.appendChild(iframeEl);
const htmlToWrite = "<html><head><title></title><script src="javascript:void(0)" defer=""></script></head><body></body></html>";
const iframeDocument = iframeEl.contentWindow.document;
iframeDocument.open();
iframeDocument.write(htmlToWrite);
iframeDocument.close();
const bodyEl = iframeDocument.querySelector("body");
console.log("Has body element", bodyEl != null);
if (bodyEl == null) {
console.log("Got", iframeDocument.documentElement.outerHTML);
}
</script>
</body>
</html>
если я удалю атрибут defer из тега сценария, document.write больше не будет записывать тег тела. Может кто-нибудь объяснить, почему это происходит?
Я бы ожидал, что он выпишет остальную часть документа, даже если src скрипта не загружается.
Комментарии:
1. Не уверен, что я точно понимаю, в чем проблема.
defer
Атрибут означает, что скрипт не будет запущен до тех пор, пока страница не завершит загрузку, поэтому для меня имеет смысл, что удалениеdefer
означает, что скрипт не будет выполнен.2. Верно. Проблема в том, что при удалении атрибута defer тег body не записывается в iframe.
3. Откуда вы знаете
<body>
, что он не создается? Путем проверки документа iframe или потомуquerySelector
, что он не возвращает его?4. Стоит отметить, что браузеры будут делать вывод
<body>
, если HTML не содержит его. Что заставляет меня подозревать ваш тест, так как я чувствую, что ни один браузер на самом деле не построит описываемый вами DOM, даже если его вынудят под дулом пистолета. Как правило, браузеры идут на крайние меры, чтобы спасти плохую разметку (не то чтобы ваша была плохой).