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

  • есть 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: , , ,

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

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

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

  • 11.07.2006 at 14:56
    Permalink

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

  • 11.07.2006 at 15:18
    Permalink

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

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

  • 30.08.2006 at 16:43
    Permalink

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

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

  • 30.08.2006 at 17:03
    Permalink

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

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

  • 31.08.2006 at 10:11
    Permalink

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

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

  • 30.12.2006 at 22:51
    Permalink

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

  • 02.01.2007 at 18:17
    Permalink

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

  • 20.03.2007 at 15:40
    Permalink

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

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

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

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

    //

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

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

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

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

  • 21.03.2007 at 14:57
    Permalink

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

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

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

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

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

  • 21.03.2007 at 16:04
    Permalink

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

  • 21.03.2007 at 18:51
    Permalink

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

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

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

  • 21.03.2007 at 18:52
    Permalink

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

  • 25.03.2007 at 03:55
    Permalink

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

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

    Всем удачи:)

  • 29.03.2007 at 12:50
    Permalink

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

  • 07.08.2007 at 15:03
    Permalink

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

  • 07.08.2007 at 15:19
    Permalink

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

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

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

Leave a Reply