"Как правильно вставить объекты Flash в вашу HTML-страницу?"
Это должно быть простой вопрос, но вероятно вызывает множество споров, так как каждый из доступных способов встраивания объектов имеет свои преимущества и недостатки. В этой статье мы исследуем трудности и тонкости встраивания Flash-содержимого и рассмотрим наиболее популярные способы вставки объектов.
Основные компоненты метода встраивания Flash-объектов
Прежде чем перейти к практике, давайте сначала охарактеризуем идеальный метод. По моему мнению, следующие критерии имеют первостепенное значение.
Соответствие стандартам
Web-стандарты предлагают универсальный язык для создателей браузеров, проектировщиков оборудования и веб-дизайнеров для того, чтобы они могли избежать проблем совместимости, зависимости от производителей, а также нарушения патентных прав. Кроме того веб-стандарты позволяют создавать правильную HTML-разметку, которая к тому же часто является требованием в веб-проектах.
Межбраузерная поддержка
Поддержка всеми основными браузерами и популярными операционными системами — это необходимое условие. Проверить разметку можно с помощью инструментария Flash embed test suite [6], который позволяет оценить, поддерживают ли браузеры тот или иной метод разметки, с помощью которой можно вставить Flash-объекты. Этот набор тестов может показать информацию о параметрах, в том числе различных настройках Flash, потоках и сценариях, поддерживаемых браузерами и ОС. Вы также можете изучить сводную таблицу, отображающую эти параметры.
Поддержка альтернативного содержимого
Во всех случаях, когда вы создаете содержимое, воспринимаемое поисковыми машинами или доступное людям, которые используют Веб без установки каких-либо плагинов, использование альтернативного содержимого — это наилучшее решение.
Избежание несоответствия между Flash-контентом и версией Flash-плеера
К сожалению для многих из нас, Flash-контент будет воспроизводиться вне зависимости от версии Flash-плеера, для которого он был создан. В этом нет ничего страшного до того момента, пока устаревший плагин не обнаружит функции, которые работают только в его более поздних версиях. Если так произойдет, ваши посетители увидят "нарушенное" содержимое или вовсе ничего не увидят.
Автоактивация интерактивного контента
Браузеры компании Microsoft работают так, что посетители не могут напрямую взаимодействовать с элементами управления Microsoft ActiveX, который позволяет загружать объекты и элементы embed
, также называемые "интерактивным контентом".
Короче говоря, браузеры Microsoft не позволят взаимодействовать с интерактивным контентом, пока пользователь самостоятельно его не активирует. Opera также внедрила похожий механизм "click-to-activate". Этот механизм работает как "лежачий полицейский" на дороге: вы должны приостановить движение, медленно переехать через него, и только потом нажать педаль газа. Это может запутать обычного интернет-серфера и разозлить даже самого опытного.
Простота реализации
Конечно же простота имеет значение. Зачем прыгать выше головы, если можно сделать проще?
Основы встраивания Flash-объектов: embed и object
Существуют два элемента HTML, которые позволяют вставить объекты Flash на веб-страницу. В одной руке, у нас есть запатентованный элемент embed
, который поддерживается большинством браузеров:
<embed type="application/x-shockwave-flash" src="myContent.swf" width="300" height="120" pluginspage="http://www.adobe.com/go/getflashplayer" /> <noembed>Alternative content</noembed>
В другой руке у нас элемент object
, который является рекомендацией W3C. Так как спецификации W3C предоставляют больше возможностей для отображения подключаемого контента, со временем появились два различных способа реализации объектов.
Большинство современных браузеров выбрали стандартом альтернативу тегу embed
, используя при этом MIME-тип объекта, чтобы подключить соответствующий плагин для воспроизведения содержимого:
<object type="application/x-shockwave-flash" data="myContent.swf" width="300" height="120"> <p>Alternative content</p> </object>
Этот метод не привязан к какому-либо определенному браузеру и поэтому это предпочтительная реализация.
Второй способ реализации создан специально для Internet Explorer на Windows. При этом требуется, чтобы вы определили атрибут classid
у объекта, чтобы браузер смог загрузить необходимый элемент управления ActiveX Flash-плеера. Такой способ допустим, но зависим от типа браузера:
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="300" height="120"> <param name="movie" value="myContent.swf" /> <p>Alternative content</p> </object>
Замечание: В двух последних примерах кода специально не указан параметр codebase
— он часто используется, чтобы уточнить URL инсталлятора Flash на серверах Adobe (браузер может автоматически загрузить его, если он еще не установлен). Однако это запрещено согласно спецификациям, которые ограничивают его доступ только в пределах домена текущего документа, и поэтому этот параметр не поддерживается всеми современными браузерами.
Почему embed все еще используется
С появлением веб-стандартов можно было бы совершенно обоснованно удалить элемент embed
. Он просто никогда не был рекомендацией W3C и никогда не будет, потому что он уже запатентован. Однако в действительности этот способ лучше поддерживается браузерами, чем отдельная реализация элемента object
. В результате такой способ реализации выбран на большинстве веб-сайтов, таких как Google Video и Brightcove.
Хотя веб-стандарты созданы, чтобы избежать проблем совместимости, элемент embed
более ясен и недвусмыслен, чем элемент object
, одобренный W3C. Жесткие правила реализации элемента embed
и хорошая поддержка превратила его в фактический стандарт, который будет использоваться до тех пор, пока не будет универсальной поддержки элемента object
, достаточной для того, чтобы игнорировать версии браузеров, которые его не поддерживают.
Где нарушена поддержка веб-стандартов
Двойственная реализация элемента object
формально не нарушает веб-стандарты, но создает множество проблем. Следовательно, нам нужно найти способ объединить два метода реализации объектов в один. Еще хуже то, что мы также должны разобраться с браузерами, которые имеют (или раньше имели) неправильную реализацию объектов. Давайте рассмотрим эти проблемы:
- Общая реализация объектов не работает в Internet Explorer на Windows. IE загружает плагин и SWF-файл, но не показывает его содержимое.
- Когда мы частично объединяем два способа реализации добавлением параметра
movie
к общей реализации, Internet Explorer отображает Flash-контент, но не проигрывает его. - Если мы полностью соединим две реализации, все заработает в Internet Explorer, но браузеры на базе Gecko проигнорируют Flash-контент и покажут альтернативное содержимое.
Одной из особенностей элемента object
является то, что вы можете вставлять этот тег друг в друга:
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="300" height="120"> <param name="movie" value="myContent.swf" /> <object type="application/x-shockwave-flash" data="myContent.swf" width="300" height="120"> <p>Alternative content</p> </object> </object>
К сожалению, из-за ошибки в старых версиях Internet Explorer встроенные друг в друга элементы object
рассматриваются так, как будто они следуют один за другим, поэтому отображаются оба элемента.
Еще хуже то, что браузеры Safari, начиная с версии 1.2.2 для Mac OS 10.3, игнорируют элемент param
, встроенный в object
, хотя поддерживают такие же атрибуты для элемента embed
.
Замечание: Вы также можете спросить, насколько разумно определять контент, атрибуты и параметры дважды, как в вышеизложенном способе. Этот комбинированный метод также делает более проблематичным использование JavaScript для взаимодействия с Flash-контентом. В таком случае вы должны проверять, с каким объектом вы взаимодействуете.
Некоторые из ошибок уже исправлены, но необщепринятая и ошибочная в Internet Explorer реализация object
все еще сдерживает абсолютное принятие этого элемента. Мы можем только надеяться, что это будет исправлено в ближайшем будущем.
Почему object лучше, чем embed
Несмотря на отсутствие поддержки всеми браузерами элемент object
все же более предпочтителен, чем элемент embed
, потому что кроме соответствия стандартам, он также обладает превосходной поддержкой альтернативного содержимого.
Элемент object
позволяет встраивать альтернативное содержимое, и это содержимое отображается, если реализация не поддерживается или не установлен плагин. Также альтернативное содержимое доступно поисковым машинам, а это неоспоримый плюс при оптимизации под поисковые запросы.
Элемент embed
поддерживает альтернативное содержимое посредством элемента noembed
, но такая реализация работает только в тех браузерах, которые не поддерживают сам элемент embed
, например Internet Explorer на платформах Windows Mobile. В отличие от элемента object
, embed
не поддерживает альтернативное содержимое, когда поддерживается сам элемент embed
, но не установлен Flash-плагин. В такой ситуации, можно довольствоваться только атрибутами pluginurl
и pluginspage
, с помощью которых отображается картинка, кликнув по которой можно установить плагин.
Я думаю, это лучшее решение для отображения альтернативного контента, чтобы описать необходимый плагин и дать намек на то, что пользователь может загрузить и установить плагин Flash. (Тем не менее, нет других причин, по которым мы должны злоупотреблять атрибутом codebase
.)
Таким образом, элемент object
обладает значительными преимуществами перед элементом embed
в том случае, если вы предпочитаете создавать соответствующий стандартам код или доступное, хорошо индексируемое поисковиками содержимое.
Недостаточность методов разметки
Принимая во внимание критерии, определенные нами ранее, — соответствие стандартам, межбраузерную поддержку, поддержку альтернативного содержимого, избежание несоответствий плейер/контент, автоконтроль интерактивного содержимого и простоту реализации — легко понять, что в действительности используются лишь те способы реализации, которые могут быть осуществлены только изменением разметки.
Хотя разметка предоставляет средства показа Flash-контента или альтернативного содержимого, она не способна решить проблемы несоответствия контента и плагина Flash или ошибки при активизации интерактивного контента, и это не всегда самый простой способ решить и ту, и другую проблему.
Однако, давайте сделаем краткий обзор наиболее популярных "комбинированных" методов встранивания Flash, осуществляемых с помощью (X)HTML-разметки.
Двусоставный метод
В Flash IDE, вы можете создавать HTML-страницы с помощью так называемого двусоставного метода, объединяющего реализацию объектов с помощью элемента object
и embed
, встроенного внутри него как альтернативный контент:
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/ pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="300" height="120"> <param name="movie" value="myContent.swf" /> <embed type="application/x-shockwave-flash" src="myContent.swf" width="300" height="120" pluginspage="http://www.macromedia.com/go/getflashplayer" /> </object>
Как видите, этот метод основан исключительно на запатентованной разметке. Он несомненно фокусируется на межбраузерной поддержке, но не соответствует стандартам.
Двусоставный метод использует избыточный код, делает ваши веб-страницы логически непоследовательными и не позволяет вставить альтернативное содержимое. А единственная преимущество — это простота в использовании, так как его генерирует Flash IDE: так что не пытайтесь просить воспроизвести этот метод по памяти.
Метод вложенных объектов
Вложение двух реализаций объектов — хорошая альтернатива двусоставному методу, потому что этот метод соответствует стандартам и поддерживает альтернативный контент:
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="300" height="120"> <param name="movie" value="myContent.swf" /> <object type="application/x-shockwave-flash" data="myContent.swf" width="300" height="120"> <p>Alternative content</p> </object> </object>
К сожалению, в этом методе отсутствует межбраузерная поддержка вследствие ошибки вложения элементов object
в IE и отсутствия поддержки вложенных элементов param
в Safari. Но можно использовать прием с условными комментариями IE, чтобы избежать ошибок браузера:
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="300" height="120"> <param name="movie" value="myContent.swf" /> <!--[if !IE]>--> <object type="application/x-shockwave-flash" data="myContent.swf" width="300" height="120"> <!--<![endif]--> <p>Alternative content</p> <!--[if !IE]>--> </object> <!--<![endif]--> </object>
При использовании приведенного выше "раздутого" кода, этот метод становится даже более сложным для создателя, чем двусоставный. Он использует безобразные уловки, которые могут усложнить процесс создания кода при использовании серверных языков.
Flash Satay
Другая альтернатива — это метод Flash Satay [7], который основан на общем способе реализации объектов и включает дополнительный параметр movie
. Этот параметр необходим, чтобы избежать ошибок отображения контента в IE. Он также включает movie-контейнер Flash (c.swf с переменной path), чтобы исправить ошибку с потоковым воспроизведением в IE:
<object type="application/x-shockwave-flash" data="c.swf?path=myContent.swf" width="300" height="120"> <param name="movie" value="c.swf?path=myContent.swf" /> <p>Alternative content</p> </object>
Хотя он приближает нас к "идеальному", универсальному способу реализации объектов, Flash Satay содержит приемы, применение которых не подойдет каждому? и при использовании этого метода встроенные элементы param
не поддерживаются старыми версиями Safari.
Аргументы в пользу DOM
Когда вы думаете о недостаточности методов разметки, вы можете поинтересоваться, почему нельзя использовать скрипты DOM. С помощью них, мы можем динамически управлять разметкой, как того требует каждый браузер, используя:
- специальную реализацию для IE;
- запатентованный элемент
embed
для старых версий Safari; - общую реализацию для всех остальных браузеров.
Скрипт DOM к тому же гибкий инструмент, достаточный для решения остальных проблем: прежде всего, мы можем использовать его для решения проблемы несовместимости Flash-плейера и Flash-контента, определяя версию плагина и проверяя то, что нужно показывать — Flash-контент или альтернативное содержимое. Когда необходимая версия плагина недоступна, мы можем инициировать экспресс-установку Adobe, — механизм встроенный в Flash-плейер. Тем самым мы упрощаем загрузку нужной версии.
Решение с применением DOM также позволяет нам избежать механизма "click-to-activate" с помощью динамического создания элементов object
.
Будьте осторожны, используя JavaScript
Так как не каждый является опытным специалистом по JavaScript — да и даже тот, кто им является, не должен заново изобретать велосипед — неплохо использовать уже существующие библиотеки JavaScript для встраивания Flash. Давайте рассмотрим критерии выбора надежной библиотеки.
Разметка по стандартам редко поддерживается создателями библиотек, так как эти библиотеки определяют Flash-контент либо в JavaScript, либо другими средствами разработки. Большинство библиотек создают неправильный HTML и, так как разметка написана динамически, W3C-валидатор не способен её проверить.
С другой стороны нужно рассмотреть, как работает такой метод, если JavaScript не доступен, не поддерживается или поддерживается только отчасти. Что делать, если используя JavaScript, вы ограничиваете доступность контента для пользователей?
Приняв во внимание вышесказанное, давайте посмотрим, как работают некоторые популярные библиотеки.
Комплект по определению плейера Adobe Flash
Кроме создания разметки в Flash IDE, Adobe также предоставляет комплект по определению плейера Flash [8]. Существует три способа использовать этот комплект:
- Проверив установлен или нет флажок Detect Flash Version (в меню File > Publish Settings > HTML) в Flash 8 IDE.
- Вставив его вручную, загрузив дистрибутив этой библиотеки.
- Работать в Flex Builder 2, где он включен по умолчанию.
Хотя пакет дает нам все желаемые возможности, такие как определение версии, экспресс-установка и автоактивация интерактивного контента, он нуждается в усовершенствовании. Когда мы полностью перейдем к стандартам, его ждет безнадежный провал: пока что он основан на двусоставной разметке, так как имеет либо реализацию объектов от Microsoft, либо поддержку запатентованного элемента embed
, не соответствующего стандартам.
Он также поддерживает альтернативный контент, хотя странным и противоречивым образом. Вы должны определить альтернативный контент дважды: в JavaScript и в элементе noscript
.
В конечном счете, комплект по определению плейера нуждается в лучшей реализации.
UFO и SWF Object
Популярные альтернативы с открытым исходным кодом, как UFO [9] Боба ван дер Слуиса и SWF Object [10] Джеффа Стирнса наверное самые полные и простые в использовании библиотеки, доступные в настоящее время.
Хотя на первый взгляд они кажутся похожими, они полностью отличаются внутренним содержанием. Например, SWF Object использует двусоставный метод Adobe, в то время как UFO генерирует главным образом соответствующую стандартам разметку. С другой стороны они используют общие архитектурные принципы: обе библиотеки построены на идее создания разметки, поддерживающей альтернативное содержимое (таким образом доступное и оптимизированное под поисковики), которое замещается DOM-скриптом, когда доступна необходимая поддержка Flash и JavaScript.
Несмотря на их явную поддержку альтернативного содержимого, обе библиотеки имеют один существенный недостаток: они зависят от JavaScript при вставке Flash-контента. В результате небольшая группа посетителей, установившая Flash плагин, но с отключенным JavaScript или с отсутствием достаточной поддержки JavaScript, будут видеть только альтернативное содержимое.
Аргументы в пользу "умеренного" программирования DOM
Чтобы решить все проблемы, вполне логично использовать следующий метод вставки: смешанную разметку, совместимую со стандартами, как та, которая используется методом Flash Satay, чтобы включить и Flash-контент, и альтернативное содержимое, наряду с применением небольшого DOM-скрипта, который необходим для устранения проблем в некоторых браузерах.
ObjectSwap [11] основан на этих принципах и на мой взгляд является образцом для будущих библиотек встраивания Flash-объектов. К сожалению, ObjectSwap концентрируется в основном на автоактивации интерактивного контента, поэтому он не пригоден для определения версии и не решает проблем с разметкой, таких как поддержка потокового воспроизведения в IE или поддержка параметров в старых версиях Safari.
С другой стороны он может быть усовершенствован. При использовании события onload
, поведение, основанное на DOM, реализуется только после загрузки всей страницы. Лучшим выбором могло бы быть событие DOMContentLoaded
, которое позволяет вам применить свое собственное поведение, как только DOM станет доступен на странице. Так как событие DOMContentLoaded
еще не полностью поддерживается браузерами, взамен этого вы можете использовать это решение [12].
Будущее встраивания Flash
Хотя совершенное решение пока еще не найдено, мы уже довольно далеко продвинулись в правильном направлении. Когда мы соединяем лучшие возможности различных библиотек, нам следует учитывать все критерии, определенные в начале этой статьи.
Статья основана на оригинальной статье online-журнала A List Arart «Flash Embedding Cage Match» [13].
Комментарии
Спасибо, статья помогла. Не отображался swf в ie теперь все гуд!
кто подскажет стоит такой код
<object width="800" height="600" align="middle" style="border:1px solid #777777;">
<param name="movie" value="file/swf/Rogo.swf">
<embed src="file/swf/Rogo.swf" width="800" height="600">
</embed>
</object>
да работает во всех бр, но ролик проигрывается постояно
так вот как измениить код чтоб флешка проигралась тока раз??
Здравствуйте! Вы так хорошо всё описываете.Подскажите, пожалуйста, почему у меня в блоге не работает код плеер.нет. Раньше работал, а потом я что-то переключил или добавил и плеер не работает. Выдаёт Ошибка HTTP:
<param name="movie" value="http://embedpleer.net/list?id=B2qbw4Bi0y0oaB175l">
<embed src=...