» Форма входа

»Мoy-weB ver.4.1

» Статистика

Главная » 2008 » Август » 18 » Встраиваем флэш-ролики, поддерживая стандарты

Встраиваем флэш-ролики, поддерживая стандарты
18.Авг.2008 | 21:42:39

Встраиваем флэш-ролики, поддерживая стандарты

Я работаю с Flash’ем уже несколько лет и всегда испытывал легкое
разочарование от того, какой html-код следует писать, чтобы встроить
ролик в веб-страницу. Недавно я создал сайт на XHTML, и мое
разочарование возросло: html-код, необходимый для отображения ролика
на сайте, просто не соответствует стандартам. На помощь был призван
новый, более аккуратный метод, который бы не конфликтовал, а дружил
со стандартами XHTML.


Доверяй, но проверяй


Flash всегда поставлялся со средствами разработки, позволяющими
автоматически генерировать страницы, содержащие флэш-ролики. Начиная
с четвертой версии, сама программа стала создавать подобных монстров:


<object
classid="clsid:D27CDB6E-AE6D
-11cf-96B8-444553540000"
codebase="http://download.macromedia.com /pub/shockwave/cabs
/flash/swflash.cab#version=6,0,0,0"
width="400" height="300" id="movie" align="">
<param name="movie" value="movie.swf">
<embed src="movie.swf" quality="high"
width="400" height="300"
name="movie" align="" type="application/x-shockwave-flash"
plug inspage="http://www.macromedia.com
/go/getflashplayer"> </object>

Учитывая то, что такой код используется на 95% страниц, он стал стандартом де-факто.


Как нетрудно заметить любому, кто уделил внимание устрашающему
html-коду выше, для отображения роликов используется два главных тэга: <object> и <embed>.


В то время, как Internet Explorer и все хорошие браузеры пользуются соответствующим стандартам тэгом <object>, Netscape и браузеры, считающие себя его друзьями, вовсю развлекаются с <embed>, полностью игнорируя <object>. Тэг <object>
содержится в спецификации XHTML, но не совсем верно реализован
в IE-дружественных браузерах: он просит браузер запустить объект
флэш-плейера и загрузить в него ролик. Элемент <param> этого тэга играет роль злого гения: передает плейеру столько параметров, сколько им (тэгом) было задано.
<embed> не попал в спецификацию XHTML. Параметры в нем передаются через пары «имя/значение».


Элемент <embed>


Этот элемент был создан Netscape как собственный метод встраивания
плагинов и плейеров в веб-страницы. Он не попал в XTHML-спецификацию и…
мы же не любим нестандартные тэги, правда? Так что — прощай, <embed>… и не забудь закрыть за собой дверь!


Элемент <object>




Мы распрощались с тэгом <embed> и у нас на руках остался только <object>,
так что придется ему вывернуться наизнанку, стараясь нам помочь.
Приятная новость — как для нас, так и для него — это то, что почти
каждый браузер в наши дни так или иначе поддерживает этот элемент.


У элемента <object> нет обязательных атрибутов,
но список доступных действительно велик. Ниже приведены те, которые
могут нас заинтересовать и понадобятся в дальнейших научных
исследованиях.


classid (URI) — может использоваться для указания
местоположения реализации объекта при помощи URI. Этот атрибут может
быть применен вместо атрибута data (рассмотрен ниже) или вместе с ним.


codebase (URI) — указывает основной путь к обработчику относительных путей, заданных атрибутами classid, data и archive. Когда этот атрибут не указан явно, он принимает значение базового URI текущего документа.


data (URI) — может быть использован для указания местоположения данных, ради которых затевались все манипуляции с тэгом <object>, или даже для проставления ссылки на серийный выпуск объекта, который сможет восстановить локальную копию.


type (content-type) — указывает тип содержания для данного «объекта».


codetype (content-type) — указывает ожидаемый тип содержания «объекта» при его открытии с помощью classid.


Есть также другие атрибуты, которые позволяют делать то, что можно запросто реализовать и в самом flash`е, а также такие, как width, height, id, class и другие общеприменимые атрибуты. Те параметры, которые перечислены выше, являются значимыми при встраивании флэш-роликов.


Другой важной вещью, которую стоит запомнить всем разработчикам, является то, что <object>
может содержать вложенные элементы, которые будут отображаться, если
отображение ролика не поддерживается компьютером (не установлен
флэш-плейер). Кстати, вот объяснение, почему этот проклятый <embed> работает в Netscape и его дружках.


Действо


Вооружившись более глубоким пониманием вопроса, я провел несколько
операций, проверяя их в разных браузерах. Для начала я убрал
ненавистный нам всем <embed>, таким образом код стал соответствовать стандартам XHTML:


<object
classid="clsid:D27CDB6E-AE6D
-11cf-96B8-444553540000" codebase="http://download.macromedia.com /pub/shockwave/cabs
/flash/swflash.cab#version=6,0,0,0"
width="400" height="300">
<param name="movie" value="movie.swf" />
</object>

К сожалению, это не работает в не-IE браузерах, но мы ведь
и не ожидали, что они сдадутся так быстро. Потратив некоторое время
на поиск, я обнаружил, что атрибут classid является
специфическим для ActiveX-конфигурации браузера. Кстати, это именно
он уговаривал Netscape и Mozilla игнорировать объект. Между тем, роль
этого атрибута крайне важна: он сообщает браузеру, каким плейером
проигрывать объект. Так что нам не удастся так же легко, как в прошлый
раз, помахать ручкой и попросить закрыть за собой дверь.


К счастью, флэш-плейер откликается также на содержание с MIME-типом application/x-shockwave-flash. Это великолепно хотя бы потому, что есть возможность указать тип объекта, используя параметр type.
Итак, мы все-таки прощаемся с

classid="clsid:D27CDB6E-AE6D
-11cf-96B8-444553540000"

и добавляем

type="application/x-shockwave-flash"

Codebase



Предыдущие махинации все равно не привели к тому, чтобы Netscape
показывал флэш-ролики. Следующим препятствием на пути отображения стал
атрибут codebase, который содержит путь к копии плагина
Flash на сервере Macromedia. На самом деле, атрибут совсем
не предполагался для такого использования, поскольку все пути в его
значениях должны быть в том же домене по соображениям безопасности.


Во многих браузерах (и особенно в IE) этот атрибут выполняет другую
функцию: в пути, который содержит его значение, записан необходимый для
запуска ролика номер версии флэш-плейера. Выполнив простое сравнение,
браузер может предложить пользователю скачать более свежую версию
проигрывателя. Обратной стороной медали в данном случае является то,
что этот атрибут останавливает проигрывание роликов в Netscape
и Mozilla, если его использовать данным образом. Значит, придется
пустить его в расход. Как восполнить потерю функциональности мы обсудим
позже.


Итак, после того, как codebase мы признали не жильцом, html-код наконец-то стал выглядеть более или менее изящно:

<object
type="application/x-shockwave-flash"
width="400" height="300">
<param name="movie" value="movie.swf" />
</object>

Если попробовать открыть этот код, он все равно не отобразит ролик в
Netscape. Дойдя до этой точки, я испугался, что во всей Вселенной
не сыскать мне способа осуществления задуманного. Так что мне пришлось
прибегнуть к обычному для таких ситуаций испытанию самых безумных идей.


Эврика!


Когда я воспользовался атрибутом data, у меня чуть
не случился удар — ролики начали внезапно проигрываться в Netscape
и Mozilla. Как выяснилось, IE тоже не отказывался их показывать.


<object type="application/x-shockwave-flash"
data="movie.swf"
width="400" height="300">
<param name="movie" value="movie.swf" />
</object>

После серии проверок с большими роликами я заметил недостаток:
браузер IE под Windows не начинал проигрывание ролика, пока не скачивал
его весь, от начала и до конца. Понятно, что такой недостаток приемлем
для небольших роликов, но никак не может ужиться с огромными. Я пришел
к выводу, что создание соответствующего стандартам кода возможно,
но только после того, как Microsoft исправит свои ошибки.


Метод Satay


Несколько дней спустя я обсуждал эту проблему с Джефри Зельдманом
(Jeffrey Zeldman), объясняя, насколько близок я был к решению проблемы.
Он тоже заинтересовался, поскольку столкнулся с той же проблемой,
разрабатывая последние проекты. Все это заставило меня задуматься, и,
наконец, когда я брел к дому по пустынным ночным улицам, меня поразила
догадка.


Как мы уже выяснили, проблема заключается в том, что Windows
не хочет проигрывать ролик, пока не скачает его весь. А как насчет
создания очень маленького ролика, который в первом же кадре будет
подгружать в себя тот ролик, который мы действительно хотим показать?


Я проверил эту догадку, и она сработала. Возможно, это небольшое
заигрывание со стандартами, но во вполне допустимых пределах. Самое
хорошее в этом способе то, что можно создать универсальный контейнер
и пользоваться им в дальнейшем для подгрузки роликов с такими же
пропорциями, как и у ролика контейнера.


Образно говоря, не имеет значения, изготовлен ли ролик из ветчины,
курятины или говядины, вам все равно придется сначала обмакнуть его
в кетчуп, чтобы ощутить его настоящий вкус. Мы назвали это методом
Satay.


Ролик-контейнер


Я создал новый ролик, в первом кадре которого разместил следующий ActionScript:


_root.loadMovie(_root.path,0);

Он указывает флэш-плейеру, чтобы тот загрузил ролик, имя которого
хранится в переменной path на нулевом уровне. Осталось только
динамически передавать эту переменную. Благодаря строковым параметрам
и тому, что они обрабатываются Flash`ем, это даже не назовешь
проблемой. Вот как решается этот вопрос: c.swf?path=movie.swf

Ролик-контейнер называется c.swf, и при таком вызове выражение,
указывающее на загрузку нужного ролика, выглядит для Flash`а так: _root.loadMovie("movie.swf",0);


Можно изменять поведение контейнера, пересылать значение переменной, используя методы post и get, но следует всегда помнить, что размер ролика-контейнера должен быть очень маленьким.


Финальный код


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


<object
type="application/x-shockwave-flash"
data="c.swf?path=movie.swf" width="400" height="300">
<param name="movie"
value="c.swf?path=movie.swf" />
</object>

Это ли не тот код, о котором я говорил с самого начала? Но не следует забывать о том, что, отбросив codebase, мы лишили себя неплохой части функциональности. Что же делать?


Компенсация жертвам


Главная проблема при отстутствии атрибута codebase
заключается в том, что браузер просто не будет предлагать пользователям
обновить флэш-плейер. Как нам с вами известно, надеяться на то, что
большинство пользователей обновит свои проигрыватели собственноручно,
не приходится.


Решение этой проблемы на удивление несложно: просто принесите
в жертву какой-то пустой ролик в самом начале страницы. Понятно, что
при его объявлении следует указать атрибут codebase.
Таким образом, жертвуя 1 КБ трафика, мы достигаем нужной
функциональности. Пусть это не самый аккуратный, зато действенный
способ, который не наживет вам врагов.


Альтернативное содержание


Помните, что я говорил о том, что тэг <object>
может содержать вложенные дочерние тэги, которые браузер будет
обрабатывать, если у него ничего не получится с открытием объекта? Это
может нам очень пригодиться.


Если просмотреть исходный код главной страницы сайта Macromedia,
можно заметить, что они подставляют картинку для тех, кто не может
просматривать флэш-ролики. Код определяет, установлен ли флэш-плейер
на компьютере, и выполняет Java-скрипт, который динамически вписывает
нужный HTML-код. Жуть как неудобно. Вот как сделал бы это я:


<object type="application/x-shockwave-flash”
data="c.swf?path=movie.swf"
width="400" height="300">
<param name="movie"
value="c.swf?path=movie.swf" />
<img src="noflash.gif"
width="200" height="100" alt="" />
</object>

Если браузер не знаком с MIME-типом application/x-shockwave-flash, он просто покажет посетителю картинку noflash.gif.


Продолжение следует


Я написал эту статью, зная, что это исследования всего одного
человека, так что научно-исследовательская работа на эту тему
продолжается. Отнеситесь к приведенной информации как к научной теории:
она считается доказанной, пока не доказана обратная.

Категория: Статьй и уроки | Просмотров: 696 | Добавил: CorsaR
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]