Третья и недеюсь заключительная часть эпопеи вокруг 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: , , ,

Share to Facebook
Share to LiveJournal
Share to MyWorld
Share to Odnoklassniki
Share to Yandex

05.07.06  
MiRacLe
 |   | RSS  | trackback url
  • Pingback: Я проcто Чудо {вище} » Blog Archive » Flash, ActiveX & IE update. part II

  • znatokNe

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

  • http://miracle.rpz.name/ MiRacLe

    неее :)
    “путь самурая” – делать то что делает js-скрипт вручную над каждой страницей, которая есть на сервере :) (методично с утра и до утра)

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

  • http://afisha.ws ec

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

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

  • http://miracle.rpz.name/ MiRacLe

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

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

  • http://afisha.ws ec

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

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

  • Neutrino

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

  • http://miracle.rpz.name/ MiRacLe

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

  • vitflash

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

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

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

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

    //

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

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

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

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

  • http://miracle.rpz.name/ MiRacLe

    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.

  • vitflash

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

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

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

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

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

  • http://miracle.rpz.name/ MiRacLe

    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 страницы, что согласитесь не густо – шансов попасть в результаты поиска стремятся к нулю…

  • vitflash

    Проверил.
    залил – “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

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

  • vitflash

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

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

    Всем удачи:)

  • http://miracle.rpz.name/ MiRacLe

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

  • Zlk

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

  • http://miracle.rpz.name/ MiRacLe

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

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

  • Pingback: Flash ActiveX & IE update — Чудо{вищные} заметки

Performance Optimization WordPress Plugins by W3 EDGE