Исходные данные:
- есть 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.
Pingback: Я проcто Чудо {вище} » Blog Archive » Flash, ActiveX & IE update. part II
Pingback: Flash ActiveX & IE update — Чудо{вищные} заметки