Исходные данные:
- есть html с swf-ками
- есть IE
- есть рамка вокруг swf-ок и hint с напоминанием о том что для использования объекта надо сначала его активироваит кликом
- есть вполне себе самодостаточный инструмент для внедрения флеша в html, который помимо того что замечательно детектит версию плеера, показывает альтернативный контент для тех у кого не обнаружилось необходимого плеера и вообще супер-комбайн – SWFObject, заодно избавляет от этих злосчастных рамок.
- ну и наконец есть “сто тыщ милёнов” уже созданных страниц со флешем.
Имея эти данные и не имея желания переписать все уже созданные страницы для использования SWFObject я задался целью найти менее трудоёмкий путь к избавлению от “рамок”.
“Путь” желающие могут изучить по предыдущим постам, а я лишь резюмирую случившееся:
- В первый же день когда я обнаружил рамки, нашёлся неочевидный выход – если через document.write(‘<object … ><param…./></object>’) IE отображает объект без уродской рамки, то разработчики IE в попыхах сделали заплатку,которая рисует рамку только вовремя рендринга страницы, проверка “на вшивость” показала, что конструкция object.outerHTML=object.outerHTML; даёт тот же эффект, что позволило пройтись по всем getElementsByTagName(‘object’) и провернуть над ними “экзекуцию”.
- Но выяснилось что при этом теряются flashvars (в наших проектах весьма часто используемых) – пришлось весьма шаманским способом их “сохранять” при “магическом переписывании”.
- Далее выяснилось что подобная операция приводит к утечке памяти и краху IE. Попытки бороться с этим только “оттягивали конец” (гусары – молчать!)
Тем временем в новых проектах я уже использую SWFObject, максимально упростив работу по его внедрению посредством плагина к smarty, publish extension-а к Flash-у и матерного слова.
А мысль о том как же бороться с проклятым IE меня не покидает…
В итоге решение оказалось на поверхности – использовать swfobject для переписывания уже внедрённых флешек:
- берём object, добавляем перед ним div
- создаём swfobject, копируем необходимые данные из object
- удаляем object из DOM-дерева
- Повторяем до потери пульса
Итоговый код можно скачать по прежнему адресу flash_replacer (v 0.7) (особо отмечу что для работы НЕОБХОДИМ swfobject.js, который надо включать в html до flash_replacer-а)
В нём в данный момент нехватает аналогичного “прогона” по embed-ам, а в остальном вполне рабочий код, который на тестовых системах не вызывает падения IE.
Technorati Tags: flash, ie, activex, swfobject
Pingback:Я проcто Чудо {вище} » Blog Archive » Flash, ActiveX & IE update. part II
MiRacLe, т.е. ты всетаки вышел на путь самурая или я не так понял? 😉
неее 🙂
“путь самурая” – делать то что делает js-скрипт вручную над каждой страницей, которая есть на сервере 🙂 (методично с утра и до утра)
этот скрипт(flash_replacer) я использую на “старых сайтах”, на “новых” – которые делаются “сейчас” я понятное дело более не “извращаюсь” – использую swfobject сразу (см. plugin к smarty) с ним заодно решается проблема вставки “альтернативного” контента (а-ля статическая[да хоть и динамическая] картинка, или культурная надпись с просьбой[приказом] скачать новый плеер).
Уважаемый MiRacLe, ваш способ замечательно работает, большое спасибо, рамки больше нет.
Но теперь случается очень неприятная вещь. IE, видимо, перегружает страницу, из-за чего в этот момент экран моргает. Как с этим бороться?
От моргания избавлятся я не пытался… думаю с этим справиться будет сложно.
Ещё раз хочу обратить Ваше внимание на то что описаный выше способ – “костыль” на тот случай когда страниц с флешем много и возможности их исправить просто нет, возможно в Вашем случае проще заменить “стандартную” вставку флеша на вставку через swfobject.js (это проще чем кажется на первый взгляд)
В свою очередь попробую избавиться от “моргания” програмным способом, но не скоро 🙂 – отпуск надо отгулять вдали от клавиатуры ;o)
Спасибо за совет. Этот вариант работает прекрасно. Никакого моргания не замечено.
Нужно только немного повозиться с кодом — не всегда swf лежит в той папке, где есть html, это же касается и swfobject.js
Какой смысл пользоваться SWFobject, который в моем случае посотянно крашил IE, когда есть оффициальный патч от Adobe, который эту проблему решает?
патч для чего? для IE ? вы путаетесь в терминологии или вообще не в курсе о чём идёт речь?
MiRacLe, Даже при самых простых обстоятельствах скрипт работает коряво почемуто…
Опсываю ситуацию:
Элементарно, взял HTML и небльшую FLASH-анимацию (внутри анимации никаких action script-ов не писал). Скачал весь “SWFObject”. из архива забрал себе “swfobject.js” (внутри ничего не менял).
В HTML-e в заголовке прописал:
В место стандартного обжетского кода вавки флэш-анимaции прописал так:
Install Flash player!
//
ЧТО В ИТОГЕ ПОЛУЧИЛОСЬ:
рамку с активацией действительно убираеет и нормально отображает при установленном плеере.
НО…как оказалось, если плеер на компе не установлен, на месте анимации предупреждающий текст (который забит в “flashcontent”) об отсутствии флэш-плеера. и все:(
При этом страница мне не предлагает установить и не устанавливает нужный плеер автоматически для просомотра анимации:(
Т.Е. ЧТО ИМЕЕМ:
У ТЕХ, кто не заморачивался со скриптами и тупо вставил анимацию через … АНИМАЦИЯ ОТОБРАЖАЕТСЯ ДАЖЕ ПРИ ОТСУТСТВИИ ПЛЕЕРА НА КОМПЕ, но с рамкой активации.
У ТЕХ, кто вставил анимцию через скрипт “swfobject.js” – ПРИ ОТСУТСТВИИ ПЛЕЕРА НА КОМПЕ, В МЕСТЕ АНИМАЦИИ ОТОБРАЖАЕТСЯ ТЕКСТ ОБ ОТСУТСТВИИ ПЛЕЕРА БЕЗ АВТОМАТИЧЕСКОЙ УСТАНОВКИ ПЛЕЕРА:(
может я чтото не так сделал? или проустил?
по сути ведь все просто должно быть?
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, т.е. автоматический инсталятор флэш-плеера прописан в файле – “expressinstall.swf”?
Этот файл нужно взять из архива SWFObject и ссылаться через скриптовый код для каждой флэш-анимации?
чудеса…сегодня попробую так сделать. Посмотрим, что получится.
Единственное, напрягает еще вопрос относительно версии плеера. Версия в инсталяторе прописывается сама чтоли? Или необходимо через исходник по мере появления новых версий (10, 11, 12 ит.д.) самому руками както подправлять код?
Или надо будет подправлять в файле скрипта – “swfobjects.js”?
Или в коде уже заранее на всяк. случай прописано нсколько следующих версий?
Да, если все так замечательно, тогда и нет необходимости подставлять GIF-заглушки. EXPRESSINSTALL.SWF – ведь сам все инсталирует получается.
Очень волнует вопрос относительно поддерживаемых версий флэш-плеера. К примеру 8-я или 9-я будет коректно работать?
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 страницы, что согласитесь не густо – шансов попасть в результаты поиска стремятся к нулю…
Проверил.
залил – “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.
жму на ссылку, страница перезагружается, анимация работает.
НО…работать то работает. Но только после нажатия на ссылку:(
Может быть есть возможность автоматизировать и упростить процесс? т.е. пользователь без плеера заходит на страницу, срабатывает скрипт и автоматически ставит плеер…далее пользователю при переходе на другие страницы плеер ставиться не будет т.к. он уже был устанолен.
Или другая альтернатива (т.е. чтобы зашел и анимация без лишних движения сама заработала)?
блин, опять теги все скрылись в тексте…
Кароче “SWFObject” я изучил и пришел к выводу:
Вместо текста, который занесен во “flashcontent” целесообразней ставить код на GIF-изображение, либо вставить обычный код flash объекта, который при отсутствии flash-плеера попросит установить его.
p.s. как оказалось при повторном тестировании на IE6, “expressinstal” – не помог загрузитья флэш-анимации (путем нажатия на ссылку).
Всем удачи:)
Вчера столкнулся с аналогичной ситуацией (с установкой плеера, точнее с её отсутствием) и заказчик настоял на том, чтобы она непременно была. После недолгих мытарств пришёл к тому же выводу – в div помещаю “стандартный” код и далее swfobject – swfobject.expressInstall как я уже писал выше срабатывал только на winxp(в системе есть 6-ой плеер из коробки)
все работает замечательно, только в ие флшевое выпадюще меню, выпадают почему-то под отстальной конетент =(
наблюдал такой “глюк” в FF, при определённых условиях (если не ошибаюсь – связано с transparency ролика), в IE не видел. Если это не военная тайна, то покажите пример глючного ролика(вместе с html) – я попробую разобраться.
Ну а вообще я этот скрипт больше не использую – как и писал выше: для вновь создаваемых страничек сразу использую swfobject
Pingback:Flash ActiveX & IE update — Чудо{вищные} заметки