Тег object в HTML: что это и какие у него атрибуты

Тег object (от английского object, «объект») подключает к странице внешний ресурс: картинку, SVG, страницу или PDF. Главная функция тега, которой нет у соседних embed и iframe, — это запасное содержимое: если файл не открылся, браузер показывает то, что записано между открывающим и закрывающим тегами. Когда-то через object запускали Flash, Java-апплеты и ActiveX, а сегодня плагинов в браузерах нет.

Дальше разобраны атрибуты, то, что открывает data, роль type, запасное содержимое, размер, SVG и PDF, работа из JavaScript, сравнение с embed и iframe и причины, по которым файл не открывается. Другие теги группы собраны в шпаргалке по тегам.

HTML
<object data="guide.pdf" type="application/pdf"
        width="600" height="400">
  <a href="guide.pdf">Скачать PDF</a>
</object>

Тег object в HTML: что это и для чего нужен

Сначала о том, что делает object на странице и в каких случаях его берут сегодня.

Тег object резервирует на странице место и открывает в нём файл по адресу из data. Как показать файл, решает браузер. Картинка выводится со своим размером и без окна внутри. SVG, страница, текст, PDF, видео и звук открываются в окне внутри тега: у SVG оно по размеру файла, у остальных файлов по умолчанию 300 на 150. Полная таблица дана в разделе про атрибут data.

Закрывающий тег нужен всегда: между <object> и </object> записывают запасное содержимое. Там могут быть текст, ссылка, img или другой object. Когда файл открылся, это содержимое на странице не видно. Рамки у тега нет.

Сегодня object берут в трёх случаях: когда нужен SVG со скриптом или с доступом из JavaScript страницы, когда PDF показывают с запасной ссылкой и когда нужна цепочка из нескольких файлов на выбор. Обычные картинки выводят тегом img, видео — тегом video, чужие страницы — тегом iframe.

Атрибуты тега object: data, type, width, height и другие

Атрибутов у object немного, и часть из них осталась от плагинов, которых в браузерах больше нет.

АтрибутЧто делаетПример
dataАдрес файла. Без него файл не открывается<object data="a.svg">
typeТип файла в формате MIME. Тип, который браузер не знает, сразу отправляет в запасное содержимое<object data="a.pdf" type="application/pdf">
widthШирина в пикселях или процентах<object width="600">
heightВысота в пикселях или процентах<object height="400">
nameНазвание окна внутри тега: на него указывает атрибут target у ссылки<object name="view">
formСвязывает тег с формой по её id<object form="order">
usemapКарта-ссылка. У object клик по областям не срабатывает, карту делают на img<object usemap="#map">
classid, codebase, codetype, archive, standby, declare, borderУстарели, были нужны плагинам. Не используютНе нужен

Атрибутов sandbox и referrerpolicy у object нет: записанные на теге, они не действуют, и скрипты внутри файла выполняются. Тег param когда-то передавал параметры плагину, сегодня он не нужен. Общие атрибуты id, class, style и hidden работают как у других тегов.

Значение name позволяет открыть ссылку внутри самого тега. У ссылки записывают target с тем же значением, и страница по её адресу загружается в object, а не в новую вкладку.

HTML
<object name="view" data="a.html"></object>

<a href="b.html" target="view">Открыть B внутри object</a>

Пример: атрибуты name и target тега object

Результат

Три ссылки открываются внутри тега object, потому что их target совпадает со значением name. Кнопка меняет адрес файла из JavaScript, строка показывает текущее содержимое.

Атрибут data тега object: что можно открыть

Атрибут data задаёт адрес файла, а размер и вид тега зависят от того, какой это файл.

Адрес в data может быть полным или относительным. Что получится на странице, зависит от файла.

ФайлРазмер тегаОкно внутри
Картинка PNG или JPGСвой размер файлаНет
SVG с размером в файлеРазмер из файлаДа
SVG только с viewBoxВся ширина контейнера, пропорции сохраненыДа
HTML-страница300 на 150Да
Текстовый файл300 на 150Да
PDF300 на 150, если у браузера есть просмотрщикДа
Видео и звук300 на 150, внутри плеерДа
Flash (.swf)Пустая область 300 на 150Нет
Файла нет по адресу0 на 0, а с запасным содержимым размер этого содержимогоНет
Нет data и нет содержимогоПустая область 300 на 150Нет

Если у тега задан display: none, файл с сервера не запрашивается. Поэтому скрытый object не тратит трафик.

HTML
<object data="photo.png"></object>
<object data="logo.svg"></object>
<object data="page.html" width="400" height="300"></object>

Атрибут type тега object: MIME-тип и поведение файла

Атрибут type подсказывает тип файла, но показывает файл браузер по ответу сервера.

В type записывают тип файла в формате MIME, например image/svg+xml или application/pdf. Превратить файл в другой нельзя: PNG с type="text/html" остаётся картинкой, только окном 300 на 150, а страница с type="image/png" открывается как страница. У embed та же страница с таким типом даёт ошибку.

Тип решает в одном случае: когда браузер его не знает. Тогда файл с сервера не загружается совсем, а сразу показано запасное содержимое. Файл PNG с type="application/x-nothing" и файл Flash с сервера не запрашиваются.

Пример: атрибут type тега object

Результат

Четыре кнопки меняют файл и атрибут type. Строки показывают размер, наличие окна и тип документа внутри тега: он зависит от файла, а не от type.

HTML
<object data="a.png" type="application/x-nothing">
  Запасной текст
</object>

Запасное содержимое тега object: когда оно показывается

Запасное содержимое показывается, когда файл не открылся, и скрыто, когда файл открыт.

Всё, что записано между <object> и </object>, браузер держит наготове. Оно выводится вместо тега, если файл не открыт.

СитуацияЧто видно
Файл открылсяФайл. Запасное содержимое скрыто
Файла нет по адресуЗапасное содержимое, пришло событие error
Сервер запретил встраивание заголовком X-Frame-Options или frame-ancestorsЗапасное содержимое, пришло событие error
Браузер не знает тип из typeЗапасное содержимое, файл не загружался
Файл FlashЗапасное содержимое
Нет dataЗапасное содержимое

Если запасного содержимого нет, а файла нет по адресу, тег сжимается до 0 на 0, и посетитель не видит ничего. Поэтому внутрь всегда записывают хотя бы ссылку или короткий текст.

Пример: запасное содержимое тега object

Результат

Каждая кнопка создаёт object с другим файлом. Строка «Что видно» показывает, на экране файл или запасное содержимое. В цепочке из трёх уровней первые два файла не найдены, и открыта картинка из самого внутреннего уровня.

Запасное содержимое может быть цепочкой. Если не открылся внешний object, браузер пробует вложенный, а если не открылся и он, показывает последний вариант, обычно img или текст.

HTML
<object data="logo.svg" type="image/svg+xml">
  <object data="logo.webp" type="image/webp">
    <img src="logo.png" alt="Логотип" loading="lazy">
  </object>
</object>

Есть тонкость с картинкой в запасном содержимом. Тег img внутри object запрашивается с сервера, даже когда основной файл открылся и картинка не видна. Атрибут loading="lazy" убирает это обращение. Вложенный object так себя не ведёт: его файл не запрашивается, пока открыт внешний.

Размер тега object: width, height и CSS

Размер задают атрибутами width и height или стилями, и у разных файлов он ведёт себя по-разному.

Без размеров картинка занимает размер файла, а страница, текст, PDF и видео получают окно 300 на 150. Для PDF этого мало, поэтому width и height у него записывают всегда. SVG, у которого в файле есть только viewBox, растягивается на всю ширину контейнера с сохранением пропорций.

Если задан один width, высота картинки считается по пропорциям: PNG 200 на 100 при width="300" занимает 300 на 150. Если заданы оба размера, картинка растягивается и искажается, а object-fit: cover обрезает её по рамке тега. SVG с viewBox в большей рамке не искажается: рисунок сохраняет пропорции и стоит по центру. Проценты считаются от контейнера: width="50%" в контейнере 303 пикселя даёт 152 пикселя.

Тег строчный, поэтому под ним остаётся зазор около 4 пикселей, как у картинки. Его убирает display: block. Рамка по умолчанию нулевая.

CSS
object {
  display: block;
  width: 100%;
  height: auto;
}

Пример: размер и CSS тега object

Результат

Кнопки задают размер атрибутами и стилями. Строки показывают итоговый размер тега и ширину контейнера. У PNG при двух размерах картинка растягивается, а object-fit обрезает её по рамке.

Тег object для SVG и PDF

SVG и PDF — сегодня главные причины, по которым вообще используют object.

SVG в object остаётся полноценным документом. Скрипт внутри файла выполняется, а тот же файл в img показан как неподвижная картинка: скрипт не запускается. В примере SVG сам меняет свой текст: в object текст заменён, в img остался прежний.

Пример: SVG со скриптом в теге object и в img

Результат

Один и тот же SVG показан двумя способами. В object скрипт заменил надпись, в img надпись осталась исходной.

Свойствоimgobject
Скрипт внутри SVGНе выполняетсяВыполняется
Доступ из JavaScript страницыНетЕсть через contentDocument, если файл с того же источника
Стили страницыНе действуютНе действуют
Запасной вариантАтрибут altВложенное содержимое

Стили страницы в файл не проникают: правило text{fill:red !important} не перекрашивает текст внутри SVG. Файл управляется своими стилями или из JavaScript через contentDocument. Для запасного варианта SVG обычно записывают картинку PNG, а чтобы она не загружалась зря, добавляют loading="lazy".

HTML
<object data="logo.svg" type="image/svg+xml">
  <img src="logo.png" alt="Логотип" loading="lazy">
</object>

PDF в object открывается просмотрщиком браузера в окне, размер которого по умолчанию 300 на 150. Поэтому width и height нужны. Внутрь записывают ссылку на файл: если PDF не открылся, она остаётся единственным способом получить документ.

HTML
<object data="guide.pdf" type="application/pdf"
        width="600" height="800">
  <p>PDF не открылся. <a href="guide.pdf">Скачать файл</a></p>
</object>

Тег object в JavaScript: contentDocument, load и error

Из JavaScript у object есть события load и error, а также contentDocument и contentWindow.

Событие load приходит, когда файл открыт: для картинки, SVG и страницы. Событие error приходит, когда файла нет по адресу и когда сервер запретил встраивание заголовком. В отличие от embed, при таком запрете показано запасное содержимое. Для файла Flash и для тега без data не приходит ни то ни другое.

JavaScript
const box = document.querySelector("object");

box.addEventListener("load", () => console.log("файл открыт"));
box.addEventListener("error", () => console.log("файл не открылся"));

Свойство contentDocument даёт документ внутри тега: у SVG, страницы и текста. Для картинки оно равно null. Если файл с другого источника, contentDocument тоже null, а contentWindow есть, но чтение contentWindow.document приводит к ошибке SecurityError.

JavaScript
const doc = box.contentDocument;

if (doc) {
  doc.getElementById("r").setAttribute("fill", "#2E8B57");
}

Если записать новое значение в свойство data, тег загрузит другой файл и снова пришлёт событие load.

JavaScript
box.data = "other.html";

Пример: тег object в JavaScript и contentDocument

Результат

Кнопки создают object с файлом. Для SVG и страницы из того же источника contentDocument читается, текст и заголовок достаются из него, а цвет меняется. Для адреса data: документ закрыт и равен null.

Тег object, embed или iframe: чем отличаются

Три тега открывают внешние файлы, но различаются запасным содержимым, доступом из скрипта и поведением при запрете.

Свойствоobjectembediframe
Запасное содержимоеЕстьНетНет
Адрес файлаdatasrcsrc
contentDocument и contentWindowЕстьНетЕсть
Запрет встраивания заголовком сервераСобытие error и запасное содержимоеСобытие load и пустое окноСтраница не показана
Страница с type="image/png"Открыта как страницаОшибкаНет такого атрибута
Картинка внутриСвой размер, без окнаСвой размер, без окнаВ окне 304 на 154 с рамкой
Закрывающий тегНуженНе нуженНужен
Атрибут sandboxНе действуетНе действуетДействует

Выбор простой. Если нужны запасное содержимое, SVG со скриптом или PDF со ссылкой на случай ошибки, берут object. Если нужны ограничения через sandbox, ленивая загрузка или чужая страница, берут iframe. Если нужно коротко показать файл без запасного варианта, подойдёт embed.

Почему тег object не работает

Если файл не открывается, причину ищут в трёх местах: в самом теге, в ответе сервера и в возможностях браузера.

ПричинаЧто видноЧто делать
Нет data и нет содержимогоПустая область 300 на 150Записать data
Файла нет по адресуЗапасное содержимое, а без него 0 на 0; событие errorПроверить адрес, открыть его отдельно
Сервер запретил встраиваниеЗапасное содержимое, событие errorДать ссылку внутри тега или взять разрешённый код
Браузер не знает тип из typeЗапасное содержимое, файл не загружалсяУбрать type или записать верный
Файл Flash или другой плагинЗапасное содержимое, а без него пустая областьЗаменить на video, canvas или скрипт
Не задан размер у PDFОкно 300 на 150, читать неудобноЗаписать width и height
Скрипт читает contentDocument файла с другого источникаЗначение null или ошибка SecurityErrorБрать файл с того же источника
У тега display: noneФайл не загружаетсяПоказать тег или не скрывать его стилем

Частые ошибки с тегом object

Основные ошибки связаны с адресом в неверном атрибуте, незакрытым тегом и ожиданием того, что object ведёт себя как iframe или img.

ОшибкаЧто происходитКак исправить
<object src="a.png"></object>У тега нет src, адрес не задан: пустая область 300 на 150Записать data
<object data="a.png" />Слэш тег не закрывает: всё записанное дальше оказывается внутри objectЗаписать </object>
<object data="a.pdf"></object>Нет размера и запасной ссылки: окно 300 на 150, а при ошибке тег пустойДобавить width, height и ссылку внутри
<object data="a.png" type="x/nothing">Тип неизвестен браузеру, файл не загружен, виден запасной текстУбрать type или записать верный
<object sandbox="">Атрибут не действует, скрипты внутри выполняютсяВзять iframe с sandbox
<object data="a.svg">Стили страницы в файл не проникают, текст не перекрашиваетсяЗадать стили в файле или через contentDocument
object.contentDocument для файла с другого источникаЗначение nullБрать файл с того же источника
Картинка в запасном содержимом без loading="lazy"Файл запрашивается, даже когда основной файл открытДобавить loading="lazy"
<object usemap="#map">Клик по областям карты не срабатываетСделать карту на img
<object data="a.swf">Flash не запускается, события нетЗаменить на video или скрипт
Категория
Поделиться в социальных сетях

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

0 Комментарии

Отправить комментарий (0)

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×