This Might Be Useful

Valid XHTML Flash SWF Objects embedding (updated)

Upd.: Добавил ещё 1 способ, более рациональный.

Для тех, кто не знает, что такое XHTML и не слышал о таком сайте, как W3C.org или просто напросто не занимается валидацией XHTML-a, эта статья, в принципе, будет бесполезной.

Лично для меня, валидный XHTML, не то чтобы очень важен, но за время работы Web Developer-ом валидация написанного кода вошла в привычку - я даже уже не обращаю особого внимания на это, а чисто автоматически пишу валидный XHTML, хоть у меня и установлен Add-On для Firefox-a: Html Validator.

Это маленькое вступление ничуть не хвастовство, всего лишь небольшая мотивация написание сей статьи. Если вы, так же как и я, проверяете валидность XHTML-a, то думаю сталкивались с тем, что Flash объекты не проходят валидацию. Лично я не обращал на это внимания, т.к. это никак не влияло на отображение страниц и до недавнего времени не было обязательным требованием со стороны заказчика (полностью валидный код вместе с flash-ем).

Код, приведённый ниже, это код, который генерируется Macromedia (теперь уже Adobe) Flash-ем при "публикации" .SWF вместе с .HTML страницей. Macromedia/Adobe Dreamweaver при вставке .SWF генерирует практически такой же код:

HTML:
  1. <object classid="clsid:d27cdb6e-ae6d-11cf-[...]" codebase="http://fpdownload.macromedia.com/
  2.    pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="180" height="80">
  3.    <param name="movie" value="logo.swf" />
  4.    <param name="quality" value="high" />
  5.    <param name="bgcolor" value="#ffffff" />
  6.    <embed src="logo.swf" quality="high" bgcolor="#ffffff" type="application/x-shockwave-flash" width="180" height="80" pluginspage="http://www.macromedia.com/go/getflashplayer" />
  7. </object>

...но в нем очень много "мусора" и поэтому он НЕ ВАЛИДНЫЙ!

В Интернете можно найти очень много статей на эту тему и про то, как этот код можно "почистить".

Способ №1.

Обратил внимание на тот интересный факт, что на сайте Macromedia(Adobe) они не используют собственный код, а вставляют Flash Javascript-ом. Стало интересно, что за способ такой и оказалось, что очень даже "сексуальный" способ, т.к. он проходит валидацию и использует <embed> тэг, из-за которого один из читателей сайта, куда я делаю "crosspost" подобных постов, поднял шум.

Кроме того, нашел в одной из статей по поводу валидной вставки Flash-а, что Способ №2 может вызвать небольшие трудности у пользователей с IE6, т.к. IE6 не может обращаться к нему, как к потоку (cannot stream). Решил оставить его, как альтернативный метод, "правильный" согласно с W3C.org.

Идея и "хитрость" вставки Flash-а при помощи Javascript-а заключается в том, что Javascript "прячет" <embed> тэг, столь "неугодный" ValidatorW3C.org и Html Validator Add-On-у.

SWFObject is a small Javascript file used for embedding Adobe Flash content. The script can detect the Flash plug-in in all major web browsers (on Mac and PC) and is designed to make embedding Flash movies as easy as possible. It is also very search engine friendly, degrades gracefully, can be used in valid HTML and XHTML 1.0 documents, and is forward compatible, so it should work for years to come.

После того, как скачали этот script и прописали внутри <head>...</head>:

HTML:
  1. <script type="text/javascript" src="swfobject.js"></script>

...можно приступать к вставке самого Flash-a, что, на мой взгляд, делаеться очень даже красиво и приятней для глаза, чем код, приведённый выше от Macromedia/Adobe Dreamweaver. Сперва вставляем элемент, внутрь которого будет вставляться Flash:

HTML:
  1. <div id="flashcontent">
  2.   Этот текст будет заменён Flash роликом, его пользователь увидит лишь в том случае, если у
  3.   него нет необходимой версии Flash Player-а или вовсе его нет.
  4. </div>

И конструкция, вставляющая Flash ролик:

HTML:
  1. <script type="text/javascript">
  2.   var so = new SWFObject("logo.swf", "flashcontent", "180", "80", "8", "#FFFFFF");
  3.   so.write("flashcontent");
  4. </script>

Все возможные параметры, которые можно передавать функции SWFObject:

HTML:
  1. var so = new SWFObject(swf, id, width, height, version, background-color [, quality, xiRedirectUrl, redirectUrl, detectKey]);

Чуточку подробней о каждом. Сперва обязательные параметры:

swf - Пусть к Flash ролику.
id - ID того элемента, куда будет вставляться Flash (в нашем случае - "flashcontent").
width - Ширина Flash ролика.
height - Соответственно, высота ролика.
background-color - Цвет фона у ролика.

Возможные дополнительные параметры:

quality - Качество отображения. По умолчанию "high".
xiRedirectUrl - Адрес, куда переадресовывать пользователей после ExpressInstall upgrade.
redirectUrl - Адрес переадресации пользователей без необходимой версии Flash Player-a.
detectKey - Специальная "URL переменная" на случай, когда нет необходимости проверять на наличие Flash-a, путем добавления к URL с документом ?detectflash=false

И это не всё. SWFObject умеет ещё много всего полезного. Например, задавать прозрачность у Flash ролика и передавать ему Flashvars (полный список параметров):

HTML:
  1. <script type="text/javascript">
  2. var so = new SWFObject("logo.swf", "flashcontent", "180", "80", "8", "#FFFFFF");
  3.   so.addParam("wmode", "transparent");
  4.   so.addVariable("variable1", "value1");
  5.   so.addVariable("variable2", "value2");
  6.   so.addVariable("variable3", "value3");
  7.   so.write("flashcontent");
  8. </script>

Думаю, не трудно догадаться, что этот способ мне больше понравился, по уделенному вниманию и времени на его описание.

Способ №2.

Брутальный способ.

1. Выкидываем <embed> тэг - он не нужен и он, как раз таки, и не проходит валидацию.
2. "Страшная" часть с classid делает лишь то, что "говорит" Internet Explorer-у какой player использовать. С этим прекрасно справляется type="application/x-shockwave-flash", поэтому classid можно тоже выкинуть.
3. Атрибут codebase указывает ссылку на копию Flash Player-а на сервере Macromedia, что является не правильным использованием этого атрибута. Правда, в некоторых браузерах (Internet Explorer), этот атрибут выполняет ещё одну функцию - указывает какую версию Flash Player-а надо использовать для просмотра .SWF и если необходима другая версия, пользователю предлагается её установить. Короче, codebase тоже выкидываем.
4. <param name="bgcolor" value="#ffffff" /> в принципе не нужно, можно оставить, можно и выкинуть. Выкинем.

В итоге получаем конструкцию, гораздо приятную, как для глаза, так и для валидатора:

HTML:
  1. <object type="application/x-shockwave-flash" data="logo.swf" width="180" height="80">
  2.    <param name="movie" value="logo.swf" />
  3.    <param name="quality" value="high" />
  4. </object>

Valid XHTML 1.0

Enjoy.

Crossposted from: LOLEG.com. You can comment here or there.

· Конвертация видео в flv из командной строки
· Включаем ReadyBoost на flash-накопителе, не прошедшем тест на скорость
· Создание загрузочного USB
· Как качать с Rutube
· Как вернуть себе контроль над директориями

- Коментировать
- Trackback

14 Responses to “Valid XHTML Flash SWF Objects embedding (updated)”


  1. tIgrA Says:

    Автор этой статьи будь осторожен в XHTML кодировании. Тэги <OBJECT> и <EMBED> нужно использовать в паре. Дело в том что было и есть множество конкурирующих под солнцем браузеров, как и веб строителей и дезинформаторов напровляющих всех в device nul. Mozilla Firefox читает тэг <EMBED> если flash player стоит как plugin. IE >3.0 читает тэг <OBJECT> и использует activex элемент. Поэтому говорить что Macromedia Flash XX генерирует некоректный код не коректно. <EMBED> поэтому какраз-то и следует инкапсулировать в <OBJECT> для отображения во всех веб-браузерах. Статья сильно вводит в заблуждение.

  2. Hairgel_Addict Says:

    Отображаемость была проверена в IE6, IE7, Firefox2 & Opera9(всегда проверяю в этих 4х), т.е. в 4 самых распространенных браузерах. <EMBED> никогда не был тэгом ни в одной из версий HTML.

    http://validator.w3.org/docs/help.html#faq-flash

    <EMBED> был создан Netscape. Не знаю как дела обстоят с этим сейчас, возможно и по сей день используется для отображения Flash-a.. Используемость Netscape по всему миру на Июль 2007 года - 1.4%. За всю свою жизнь не встречал человека, пользующегося им. Параметры передаваемые в нем дублируются в <param name="" value"">

    Даже специально только что скачал/установил последнюю версию Safari для Windows (BETA какая-то там). Прекрасно работает. Без понятия, что там "вводит в заблуждение". Почему-то более чем уверен, что вы никогда не занимались валидацией XHTML или просто не работали с клиентами, в частности, иностранцами, которые тупо заходят на http://validator.w3.org/, вводят адрес сайта, тычут пальцем и говорят "fix it."

    А что насчет Macromedia, то они на своем сайте вовсе не используют собственный код, а вставляют flash javascript-ом.

  3. tIgrA Says:

    Элемент <EMBED> не поддерживается консорциумом W3C(хотя там и Microsoft,...) и поэтому он не включен в официальную спецификацию HTML. Встраиваемые в страницу обьекты могут быть файлами любого типа, которые обрабатываются модулями plug-ins установленными в браузере. Для отображения, какой plug-ins должен быть зыдействован, в атрибуте TYPE прописывается MIME тип. Тэг появился в Netscape. От куда у Mozilla голова наверняка знаешь. IE кстати спецификацию W3C не соблюдает(так как поддерживает "лунные" тэги). У Firefox-a тоже есть косяки с object. Ты пишешь код для IE, Firefox, Opera. И в тоже время обращаешься к проверщику W3C. Понимаешь броузеры не работают как единая спецификация. И в жизне приходится выходить другой дорогой. У меня как раз и была лажа в Firefox и IE.(я тоже как ты хитрил. получалось то в IE объект не отображается, то в Firefox. В итоге я вспомнил как хитрила когда-то Macromedia). Ну а усли клиент хочет что бы код работал только в IE, то нужно использовать validator раз просят. Хотя можно написать и свой валидатор и написать свои стандарты кодирования. Я думаю не спроста W3C валидатор ругается. Тут замешаны интересы microsoft (я не ругаю). Напишут все дизайнеры "правильный" код. А пользователю левого браузера придётся сменить на правильный IE. Запустит клиент валидацию - код "правильный". Откроет клиент как я в двух браузерах, увидит косяк, и найдет причину заплатить меньше. Хитрые клиенты пошли. :)

  4. Hairgel_Addict Says:

    "Отображаемость была проверена в IE6, IE7, Firefox2 & Opera9"

    Отображаемость была проверена = Везде отображаеться. Пусть он хоть все 4 (5 включая Safari) откроет - везде, где вёрстку делал я, сайт будет отображаться нормально - без "косяков" (если конечно программисты не испахабят)..

    З.Ы.: речь шла только о flash. не про какие другие "вставки" с помощью object или embed...

  5. tIgrA Says:

    Нестандартные атрибуты одна из составляющих стандарта DOM.
    jungle/html недано быть совместимым с xhtml.
    Если будешь искать jungle/html в google, то найдёшь одни фотографии джунглей. :)
    Но я не хочу как робот выполнять "часто глупые" рекомендации w3c
    и следовать xhtml. xhtml - это для роботов.
    Вместо тонны xhtml кода я могу написать 1 строку использования компонента jungle/html.
    Вот пример:
    <input type="text" size="12" mymask="url" maxlength="12">
    w3c валидатор как всегда ругнётся. А на самом деле это
    мои фичи с javascript-ом. На скрепте написан процессор.
    Я с яваскриптом подключаю процессор и компоненты многоразового
    использования и использую нестандартные тэги ибо w3c и microsoft еще не дорос.
    Сочувствую xhtml друйдам.

  6. Hairgel_Addict Says:

    Я походе не понятно пишу или вы не хотите просто напросто понять, что я написал, как в посте, так и в комментариях.

    В сочувствии не нуждаюсь.

  7. tIgrA Says:

    Не какую панику не поднимал. Я не холодный робот. Теперь статья действительно заимела пользу. Согласись без дополнительной мотивации она оставалась бы тем чем была.

  8. cdre4e Says:

    сорри что не по теме
    не врубаюсь как зарегить нового ползователя на этом саите

  9. Filosoff Says:

    cdre4e @ 29.08.2007, 11:05 #

    не врубаюсь как зарегить нового ползователя на этом саите

    никак. а зачем это надо?

  10. tIgrA Says:

    Помещаю ссылку на дополнительную информацию по тэгам OBJECT и EMBED
    http://flash-ripper.com/articles/flash/1997_06_19_object_embed_tag_attribs.htm

  11. cdre4e Says:

    Filosoff @ 30.08.2007, 14:07 #

    cdre4e @ 29.08.2007, 11:05 #

    не врубаюсь как зарегить нового ползователя на этом саите

    никак. а зачем это надо?

    уупс сорри , думал регаца надо чтоб постить :D

  12. Mikael Says:

    Блин, а я и не знал! Спасибо!

  13. мотоцикл Says:

    Мдя, незнал, спасибо за инфу

  14. SiRius Says:

    Автору ЗАЧОТ!!!
    Спасибо. Давно искал такую инфу.

Leave a Reply

code