Что такое about:srcdoc и как встроить HTML в iframe через srcdoc

Адрес about:srcdoc браузер даёт фрейму, чей HTML записан прямо в атрибуте srcdoc тега iframe, поэтому он виден в консоли и в location.href.

Показываем, как встроить код через srcdoc, экранировать кавычки, закрыть фрейм атрибутом sandbox и не сломать якоря и относительные пути. Примеры проверены в Chrome 154.

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 2879 статей автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3533 экспертных мнения Подписаться на Телеграм-канал
Обложка: Что такое about:srcdoc и как встроить HTML в iframe через srcdoc

about:srcdoc — служебный адрес документа, который браузер собрал из атрибута srcdoc у тега <iframe>. Внешнего сайта за ним нет: HTML-код фрейма записан прямо в странице-родителе, и браузеру нужно хоть как-то назвать такой документ. Отсюда и строка about:srcdoc в консоли, в инструментах разработчика и в location.href внутри фрейма.

Ниже разберём, где этот адрес встречается, как встроить HTML через srcdoc и какие ошибки ловят новички. Если вы только начинаете с разметкой, сначала пригодится разбор что такое HTML и как устроена страница, а системно язык разбирают на курсах HTML.

CheckroiCheckroiПодборка курсов по HTML208 курсов • 42 школыСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Откуда в браузере берётся about:srcdoc

Рой разбирает фрейм about:srcdoc в инструментах разработчика

Адрес появляется сам, как только на странице есть фрейм с атрибутом srcdoc. Так его называет стандарт HTML, и так он подписан в документации Chromium по особым адресам.

Чаще всего его видят в трёх местах:

  • Консоль DevTools. Сообщение или ошибка из скрипта внутри фрейма подписаны источником about:srcdoc вместо адреса сайта.
  • Выпадающий список контекстов в консоли Chrome: фрейм с srcdoc стоит там отдельной строкой.
  • JavaScript внутри фрейма. location.href и document.URL возвращают строку about:srcdoc.

На вирус или сбой браузера такой адрес не указывает. Так работают редакторы писем, онлайн-песочницы кода, превью шаблонов и виджеты, которые рисуют свой HTML внутри чужой страницы.

Как заглянуть внутрь about:srcdoc через DevTools

Содержимое фрейма видно в инструментах разработчика Chrome, открыть их можно клавишей F12. Удобнее всего идти так:

  1. Во вкладке Elements найдите тег <iframe> и раскройте его. Под ним лежит #document: это и есть собранный из srcdoc документ.
  2. Во вкладке Console откройте выпадающий список контекстов над строкой ввода (по умолчанию в нём стоит top) и выберите фрейм. Теперь команды выполняются внутри него, и location.href вернёт about:srcdoc.
  3. Если фрейм засыпает консоль сообщениями, в настройках консоли включите Selected context only: останутся только сообщения выбранного контекста.

Оба приёма описаны в справке Chrome DevTools по консоли. Пример там как раз про рекламный фрейм, который шумит в чужой консоли.

Канал основателя Checkroi Вани Буявца3 700 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединиться

Как встроить HTML через srcdoc: пошаговая инструкция

Для проверки хватит одного файла. Если ещё не создавали его руками, вот как создать HTML-файл и открыть его в браузере.

  1. Создайте файл index.html и добавьте в него тег <iframe>.
  2. В атрибут srcdoc запишите разметку, которую нужно показать во фрейме. Полный документ с <!doctype> и <body> писать не обязательно, хватит содержимого body.
  3. Задайте ширину и высоту, иначе фрейм займёт 300 на 150 пикселей.
  4. Откройте файл в браузере и убедитесь, что текст появился внутри рамки.
  5. Усложните содержимое: внутри srcdoc работают те же теги, что на обычной странице, например таблицы или списки.
<iframe
  width="400"
  height="120"
  srcdoc="<p>Привет из srcdoc</p>">
</iframe>

Мы прогнали этот пример в Chrome 154: внутри фрейма document.body.innerText вернул «Привет из srcdoc», а location.href вернул about:srcdoc.

Чем srcdoc отличается от src и data-адреса

Окно браузера с вложенной страницей внутри рамки фрейма

Все три способа кладут во фрейм документ, но ведут себя по-разному. Главное отличие srcdoc: фрейм живёт в том же источнике (origin), что и родительская страница. По справке MDN (страница на английском, русский перевод MDN убрал), если стоят оба атрибута, srcdoc важнее, а src остаётся запасным вариантом для браузеров без поддержки.

Способ Откуда берётся HTML Адрес документа Источник (origin)
src="/page.html" отдельный запрос к серверу адрес страницы источник этого адреса
srcdoc="…" строка в самом атрибуте about:srcdoc как у родителя
src="data:text/html,…" строка в адресе сам data-адрес непрозрачный, null

Проверили и приоритет. Фрейму дали сразу src="/other.html" и srcdoc="<p>победил srcdoc</p>": показался второй текст, запрос к другой странице на экран не попал.

Когда выбирать srcdoc, а когда src

srcdoc удобен, когда HTML у вас уже на руках и отдельный адрес ему не нужен. Типичные случаи:

  • Превью письма или шаблона. Стили письма не смешиваются со стилями админки, потому что у фрейма свой документ.
  • Песочница кода. Пользователь пишет разметку, и вы тут же показываете результат, без запроса к серверу.
  • Изолированный виджет. Небольшой блок, которому нужен чистый CSS без влияния стилей страницы.

Отдельная страница через src лучше, когда контент большой, его нужно кешировать или открывать по прямой ссылке. Длинная строка в атрибуте раздувает HTML родителя, и браузер скачивает её при каждой загрузке страницы. Сами теги внутри srcdoc те же, что в обычной разметке: абзацы, заголовки, ссылки.

Как экранировать кавычки и спецсимволы

HTML внутри srcdoc лежит в значении атрибута, поэтому двойная кавычка обрывает его на полуслове. Правила из MDN сводятся к двум шагам.

  • Двойные кавычки внутри разметки заменяйте на &quot;. Можно и наоборот: атрибут в одинарных кавычках, а одинарные внутри заменять на &apos;.
  • Амперсанд удваивайте. В srcdoc запись &lt; уже означает знак «меньше», то есть тег. Чтобы во фрейме был виден текст «<b>», пишите &amp;lt;b&amp;gt;.
<iframe srcdoc="<p>&amp;lt;b&amp;gt; это текст, а не тег</p>
<p title=&quot;подсказка&quot;>наведите курсор</p>"></iframe>

В Chrome первая строка вышла как «<b> это текст, а не тег», атрибут title второго абзаца получил значение «подсказка».

Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 700 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

srcdoc и безопасность: зачем нужен sandbox

Рой закрывает встроенный фрейм в прозрачную песочницу

Код в srcdoc-фрейме без ограничений получает доступ к родителю. В нашем тесте скрипт из фрейма прочитал parent.document.title без единой ошибки. Чужой или пользовательский HTML в srcdoc без sandbox вставлять нельзя: он сможет читать и менять вашу страницу.

Решение: атрибут sandbox. Без значения allow-same-origin фрейм получает непрозрачный источник, и родительская страница для него закрыта.

<iframe sandbox="allow-scripts"
  srcdoc="<script>parent.postMessage({o: self.origin}, '*')</script>">
</iframe>

// что пришло родителю:
{ o: "null" }

Общаться с таким фреймом можно только сообщениями через postMessage. Набор разрешений для sandbox описан в стандарте: allow-scripts, allow-forms, allow-popups и другие.

Как менять содержимое фрейма из JavaScript

Атрибут доступен как свойство HTMLIFrameElement.srcdoc. Присвоили строку, и браузер пересобрал документ и вызвал событие load.

const frame = document.querySelector('iframe');
frame.addEventListener('load', () => {
  console.log(frame.contentDocument.body.innerText); // "Новый текст"
}, { once: true });
frame.srcdoc = '<h1>Новый текст</h1>';

Так устроены онлайн-редакторы вёрстки: вы печатаете код слева, а справа фрейм получает новую строку srcdoc. Каждое присваивание пересоздаёт документ целиком, поэтому переменные и обработчики старого содержимого пропадают.

Если нужно дописать кусок без замены всего документа, работайте с frame.contentDocument напрямую: без sandbox он доступен родителю, как обычный документ.

Частые ошибки и что с ними делать

Ссылка-якорь открывает во фрейме всю страницу

Симптом: клик по <a href="#end"> внутри srcdoc грузит во фрейм копию родительской страницы. Причина: базовый адрес srcdoc-документа совпадает с адресом родителя, и якорь превращается в /index.html#end. Мы воспроизвели это в Chrome: после клика у фрейма стал адрес родителя с хвостом #end.

Решение: пишите якоря полным адресом about:srcdoc#end, как советует MDN. Как вообще устроены ссылки и якоря, разобрано в статье про гиперссылки.

Картинки и ссылки ведут не туда

Относительный путь pic.png внутри srcdoc считается от страницы-родителя. В тесте он превратился в http://127.0.0.1:18977/pic.png, то есть в папку рядом с index.html.

Решение: храните файлы рядом с родителем или пишите адреса от корня сайта: /img/pic.png.

Разметка обрывается на первой кавычке

Двойная кавычка внутри значения закрыла атрибут, остальной код браузер прочитал как новые атрибуты тега iframe. Решение: экранирование из раздела выше: &quot; вместо ".

Родитель читает фрейм раньше времени

Если родитель читает contentDocument сразу после присваивания srcdoc, документ ещё не собран. Решение: ждать события load, как в примере с JavaScript.

Ошибка в консоли «с about:srcdoc»

Браузер тут ни при чём: сломался скрипт внутри фрейма. В DevTools переключите контекст консоли на нужный фрейм и смотрите строку, указанную рядом с about:srcdoc.

Где освоить HTML и JavaScript системно

Фреймы, песочница и postMessage встречаются в работе фронтенд-разработчика каждую неделю: виджеты оплаты, превью писем, встроенные редакторы. Если хочется разбираться в этом не по одной статье, посмотрите дорожную карту фронтенд-разработчика и обзор профессии HTML-верстальщика.

Ниже пять программ по HTML с ценами и длительностью, данные обновляются вместе с сайтами школ.

КурсШколаСтоимость со скидкойВ рассрочкуДлитель­ностьОбзор курса от Checkroi
HTML и CSS с нуля
Перейти на сайт курса
SkillboxSkillbox91 626 ₽7635 ₽/мес.11 месяцевОбзор курса
HTML и CSS. Адаптивная вёрстка и автоматизация
Перейти на сайт курса
HTMLAcademyHTML Academy23 400 ₽3900 ₽/мес.2 месяцаОбзор курса
Основы вёрстки HTML и CSS
Перейти на сайт курса
Академия СинергияАкадемия Синергия32 676 ₽2723 ₽/мес.3 месяцаОбзор курса
HTML и CSS с нуляSkyproSkypro195 160 ₽7972 ₽/мес.12 месяцевОбзор курса
Frontend-разработчик: сайты на HTML/CSS/JavaScript
Перейти на сайт курса
CoddyCoddy9200 ₽ - 3 месяцаОбзор курса

Больше программ — в полном каталоге курсов по HTML

Часто задаваемые вопросы

Что такое about:srcdoc?

Это адрес документа внутри тега iframe, HTML которого записан прямо в атрибуте srcdoc. Отдельного сайта за ним нет, браузер собирает страницу из строки в коде родителя.

Опасен ли about:srcdoc в консоли браузера?

Сам адрес ни о чём опасном не говорит: так подписан любой фрейм с атрибутом srcdoc, например превью письма или виджет. Сообщения с этой подписью пришли из скрипта внутри такого фрейма.

Чем srcdoc отличается от src у iframe?

src загружает отдельную страницу по адресу, а srcdoc берёт HTML из самого атрибута. Если указаны оба, браузер показывает srcdoc, а документ получает тот же источник (origin), что и родительская страница.

Как скрыть сообщения about:srcdoc в консоли Chrome?

Выберите в выпадающем списке контекстов консоли нужную страницу и включите в настройках консоли пункт Selected context only. Сообщения из других фреймов перестанут показываться.

Работают ли скрипты внутри srcdoc?

Да, без атрибута sandbox скрипты выполняются и даже видят родительскую страницу. С sandbox их нужно разрешить значением allow-scripts, а доступ к родителю останется закрыт, пока нет allow-same-origin.

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!