чудо{вищные} заметки

Sorry for my terrible english. My native language is PHP.

Третья и недеюсь заключительная часть эпопеи вокруг IE, Flash и ActiveX.

Исходные данные:

  • есть html с swf-ками
  • есть IE
  • есть рамка вокруг swf-ок и hint с напоминанием о том что для использования объекта надо сначала его активироваит кликом
  • есть вполне себе самодостаточный инструмент для внедрения флеша в html, который помимо того что замечательно детектит версию плеера, показывает альтернативный контент для тех у кого не обнаружилось необходимого плеера и вообще супер-комбайн — SWFObject, заодно избавляет от этих злосчастных рамок.
  • ну и наконец есть «сто тыщ милёнов» уже созданных страниц со флешем.

Имея эти данные и не имея желания переписать все уже созданные страницы для использования SWFObject я задался целью найти менее трудоёмкий путь к избавлению от «рамок».

«Путь» желающие могут изучить по предыдущим постам, а я лишь резюмирую случившееся:

  1. В первый же день когда я обнаружил рамки, нашёлся неочевидный выход — если через document.write(‘<object … ><param…./></object>’) IE отображает объект без уродской рамки, то разработчики IE в попыхах сделали заплатку,которая рисует рамку только вовремя рендринга страницы, проверка «на вшивость» показала, что конструкция object.outerHTML=object.outerHTML; даёт тот же эффект, что позволило пройтись по всем getElementsByTagName(‘object’) и провернуть над ними «экзекуцию».
  2. Но выяснилось что при этом теряются flashvars (в наших проектах весьма часто используемых) — пришлось весьма шаманским способом их «сохранять» при «магическом переписывании».
  3. Далее выяснилось что подобная операция приводит к утечке памяти и краху IE. Попытки бороться с этим только «оттягивали конец» (гусары — молчать!)

Тем временем в новых проектах я уже использую SWFObject, максимально упростив работу по его внедрению посредством плагина к smarty, publish extension-а к Flash-у и матерного слова.

А мысль о том как же бороться с проклятым IE меня не покидает…

В итоге решение оказалось на поверхности — использовать swfobject для переписывания уже внедрённых флешек:

  1. берём object, добавляем перед ним div
  2. создаём swfobject, копируем необходимые данные из object
  3. удаляем object из DOM-дерева
  4. Повторяем до потери пульса

Итоговый код можно скачать по прежнему адресу flash_replacer (v 0.7) (особо отмечу что для работы НЕОБХОДИМ swfobject.js, который надо включать в html до flash_replacer-а)
В нём в данный момент нехватает аналогичного «прогона» по embed-ам, а в остальном вполне рабочий код, который на тестовых системах не вызывает падения IE.

Upd: «Это» скоро кончиться

Technorati Tags: , , ,

Реклама

Июль 5, 2006 - Posted by | dev, flash, js, web

21 комментарий »

  1. […] 30.06 — теперь используется SWFObject для внедрения “переписанных флешек”, в связи с этим баги с падением IE исчезли, но “маленько” уменьшилась функциональность — восстановлю на днях работу c embed и flashvars, которые передаются get-параметрами в src мувика Уже месяц висит draft-пост про “завершение эпопеи”… но похоже конца этой “эпопеи” нет и не предвидится ;o) Продолжение следует… […]

    Уведомление от Я проcто Чудо {вище} » Blog Archive » Flash, ActiveX & IE update. part II | Июль 6, 2006

  2. MiRacLe, т.е. ты всетаки вышел на путь самурая или я не так понял? ;-)

    комментарий от znatokNe | Июль 11, 2006

  3. неее :)
    «путь самурая» — делать то что делает js-скрипт вручную над каждой страницей, которая есть на сервере :) (методично с утра и до утра)

    этот скрипт(flash_replacer) я использую на «старых сайтах», на «новых» — которые делаются «сейчас» я понятное дело более не «извращаюсь» — использую swfobject сразу (см. plugin к smarty) с ним заодно решается проблема вставки «альтернативного» контента (а-ля статическая[да хоть и динамическая] картинка, или культурная надпись с просьбой[приказом] скачать новый плеер).

    комментарий от MiRacLe | Июль 11, 2006

  4. Уважаемый MiRacLe, ваш способ замечательно работает, большое спасибо, рамки больше нет.

    Но теперь случается очень неприятная вещь. IE, видимо, перегружает страницу, из-за чего в этот момент экран моргает. Как с этим бороться?

    комментарий от ec | Август 30, 2006

  5. От моргания избавлятся я не пытался… думаю с этим справиться будет сложно.
    Ещё раз хочу обратить Ваше внимание на то что описаный выше способ — «костыль» на тот случай когда страниц с флешем много и возможности их исправить просто нет, возможно в Вашем случае проще заменить «стандартную» вставку флеша на вставку через swfobject.js (это проще чем кажется на первый взгляд)

    В свою очередь попробую избавиться от «моргания» програмным способом, но не скоро :) — отпуск надо отгулять вдали от клавиатуры ;o)

    комментарий от MiRacLe | Август 30, 2006

  6. Спасибо за совет. Этот вариант работает прекрасно. Никакого моргания не замечено.

    Нужно только немного повозиться с кодом — не всегда swf лежит в той папке, где есть html, это же касается и swfobject.js

    комментарий от ec | Август 31, 2006

  7. Какой смысл пользоваться SWFobject, который в моем случае посотянно крашил IE, когда есть оффициальный патч от Adobe, который эту проблему решает?

    комментарий от Neutrino | Декабрь 30, 2006

  8. патч для чего? для IE ? вы путаетесь в терминологии или вообще не в курсе о чём идёт речь?

    комментарий от MiRacLe | Январь 2, 2007

  9. MiRacLe, Даже при самых простых обстоятельствах скрипт работает коряво почемуто…

    Опсываю ситуацию:
    Элементарно, взял HTML и небльшую FLASH-анимацию (внутри анимации никаких action script-ов не писал). Скачал весь «SWFObject». из архива забрал себе «swfobject.js» (внутри ничего не менял).

    В HTML-e в заголовке прописал:

    В место стандартного обжетского кода вавки флэш-анимaции прописал так:
    Install Flash player!

    //

    ЧТО В ИТОГЕ ПОЛУЧИЛОСЬ:
    рамку с активацией действительно убираеет и нормально отображает при установленном плеере.

    НО…как оказалось, если плеер на компе не установлен, на месте анимации предупреждающий текст (который забит в «flashcontent») об отсутствии флэш-плеера. и все:(
    При этом страница мне не предлагает установить и не устанавливает нужный плеер автоматически для просомотра анимации:(

    Т.Е. ЧТО ИМЕЕМ:
    У ТЕХ, кто не заморачивался со скриптами и тупо вставил анимацию через … АНИМАЦИЯ ОТОБРАЖАЕТСЯ ДАЖЕ ПРИ ОТСУТСТВИИ ПЛЕЕРА НА КОМПЕ, но с рамкой активации.
    У ТЕХ, кто вставил анимцию через скрипт «swfobject.js» — ПРИ ОТСУТСТВИИ ПЛЕЕРА НА КОМПЕ, В МЕСТЕ АНИМАЦИИ ОТОБРАЖАЕТСЯ ТЕКСТ ОБ ОТСУТСТВИИ ПЛЕЕРА БЕЗ АВТОМАТИЧЕСКОЙ УСТАНОВКИ ПЛЕЕРА:(

    может я чтото не так сделал? или проустил?
    по сути ведь все просто должно быть?

    комментарий от vitflash | Март 20, 2007

  10. Using Express Install with SWFObject

    SWFObject has full support for the Adobe Flash Player Express Install feature. Your users never have to leave your site to upgrade their player.

    комментарий от MiRacLe | Март 21, 2007

  11. MiRacLe, т.е. автоматический инсталятор флэш-плеера прописан в файле — «expressinstall.swf»?
    Этот файл нужно взять из архива SWFObject и ссылаться через скриптовый код для каждой флэш-анимации?

    чудеса…сегодня попробую так сделать. Посмотрим, что получится.

    Единственное, напрягает еще вопрос относительно версии плеера. Версия в инсталяторе прописывается сама чтоли? Или необходимо через исходник по мере появления новых версий (10, 11, 12 ит.д.) самому руками както подправлять код?
    Или надо будет подправлять в файле скрипта — «swfobjects.js»?
    Или в коде уже заранее на всяк. случай прописано нсколько следующих версий?

    Да, если все так замечательно, тогда и нет необходимости подставлять GIF-заглушки. EXPRESSINSTALL.SWF — ведь сам все инсталирует получается.

    Очень волнует вопрос относительно поддерживаемых версий флэш-плеера. К примеру 8-я или 9-я будет коректно работать?

    комментарий от vitflash | Март 21, 2007

  12. If you want to see ExpressInstall in action, you can install Flash player 7 (or 6.0.65) and visit this page.

    Eсть мнение, что flash-плеер 6 есть в виндовой системе сразу после установки винды, поэтому в IE этот expressInstall «магическим образом» сработает и новый плеер появиться «из неоткуда».
    Основная задача expressInstall — обновлять плеер.

    Обновлять исходники нет нужды — «новизну» плеера определяет мувик на adobe.com

    Собственно чудеса на этом заканчиваются. Для того чтобы «проскипать» «детекцию» версии плеера в swfobject есть специальный параметр detectKey (10-ый параметр в конструкторе) — это имя get-параметра, который должен быть передан в url-страницы. С ним(параметром) при отсутствии плеера браузер сам сообщит об отсутствующем плагине.

    Впрочем неясно зачем я это пишу, если все примеры есть в архиве swfobject…

    Сам этой чёрной магией в повседневной жизни не пользуюсь поскольку считаю, что пользователь не установил/отключил плеер сознательно и «насильничать» над ним не хочу.

    Насчёт заглушек — это предлагаю решать самостоятельно.
    Я считаю что они нужны. И не только тем, у кого отсутствует/отключён плеер, но и например для поисковиков, которым плевать на флеш — им нужен гипертекстовый контент. В качестве примера — есть некий сайт-презентация, целиком оформленный на флеше, без альтернативного контента поисковым ботам останется только title страницы, что согласитесь не густо — шансов попасть в результаты поиска стремятся к нулю…

    комментарий от MiRacLe | Март 21, 2007

  13. Проверил.
    залил — «expressinstall.swf»
    прописал в скрипте путь на флэш-анимацию и на «экспрессинстал». Получилос вот так примерно:

    Install Flash player!

    var so = new SWFObject(«img/head.swf», «head», «405», «133», «9», «#FFFFFF»);
    so.useExpressInstall(‘img/expressinstall.swf’);
    so.addParam(«quality», «high»);
    so.write(«flashcontent»);

    В ИТОГЕ:
    на компе где все флэш-плееры были мной принудительно и предварительно удалены — анимация не загрузилась.
    Вместо анимации мой текст: «Install Flash player!» со ссылкой на: 123.php?detectflash=falseInstall.

    жму на ссылку, страница перезагружается, анимация работает.

    НО…работать то работает. Но только после нажатия на ссылку:(
    Может быть есть возможность автоматизировать и упростить процесс? т.е. пользователь без плеера заходит на страницу, срабатывает скрипт и автоматически ставит плеер…далее пользователю при переходе на другие страницы плеер ставиться не будет т.к. он уже был устанолен.
    Или другая альтернатива (т.е. чтобы зашел и анимация без лишних движения сама заработала)?

    комментарий от vitflash | Март 21, 2007

  14. блин, опять теги все скрылись в тексте…

    комментарий от vitflash | Март 21, 2007

  15. Кароче «SWFObject» я изучил и пришел к выводу:
    Вместо текста, который занесен во «flashcontent» целесообразней ставить код на GIF-изображение, либо вставить обычный код flash объекта, который при отсутствии flash-плеера попросит установить его.

    p.s. как оказалось при повторном тестировании на IE6, «expressinstal» — не помог загрузитья флэш-анимации (путем нажатия на ссылку).

    Всем удачи:)

    комментарий от vitflash | Март 25, 2007

  16. Вчера столкнулся с аналогичной ситуацией (с установкой плеера, точнее с её отсутствием) и заказчик настоял на том, чтобы она непременно была. После недолгих мытарств пришёл к тому же выводу — в div помещаю «стандартный» код и далее swfobject — swfobject.expressInstall как я уже писал выше срабатывал только на winxp(в системе есть 6-ой плеер из коробки)

    комментарий от MiRacLe | Март 29, 2007

  17. все работает замечательно, только в ие флшевое выпадюще меню, выпадают почему-то под отстальной конетент =(

    комментарий от Zlk | Август 7, 2007

  18. наблюдал такой «глюк» в FF, при определённых условиях (если не ошибаюсь — связано с transparency ролика), в IE не видел. Если это не военная тайна, то покажите пример глючного ролика(вместе с html) — я попробую разобраться.

    Ну а вообще я этот скрипт больше не использую — как и писал выше: для вновь создаваемых страничек сразу использую swfobject

    комментарий от MiRacLe | Август 7, 2007

  19. Большое (ОЧЕНЬ БОЛЬШОЕ) спасибо автору!

    комментарий от MVH | Февраль 5, 2008

  20. Уважаемый автор, а не могли бы Вы предоставить пример с кодом, использования плагина к smarty для swfobject
    есть проблема пунктирной линии вокруг mp3 флеш плеера при клике на плеер

    комментарий от Дмитрий | Июль 5, 2009

  21. Уважаемый. Пример использования во первых строках кода плагина.

    комментарий от MiRacLe | Июль 5, 2009


Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: