Jak obejít “nefunkční” Flashe po aktualizaci IE
20.04.2006 19:36Pokud máte např. web, který je celý ve flashi (což já osobně nemám opravdu rád) nebo máte na svém webu flashové reklamy, tak s nejnovější aktualizací Internet Exploreru je většina flashů “neaktivních”. Flash je sice neaktivní, ale ve stránce se zobrazí a animace fungují, ale nefungují na něm žádné události (kliknutí, přejetí myši apod.). Aby flash fungoval normálně, tak uživatel musí myší nad flash najet a kliknout (nebo stisknout Enter), čímž se flash aktivuje a začně chovat jako obvykle.
Toto trápení je způsobeno změnou zpracování ActiveX komponent v IE a týká se to tagů APPLET, EMBED a OBJECT. Pro autory webů s flashovým obsahem nebo zadavatele flashové reklamy to je nepříjemná věc, kterou je naštěstí možné obejít.
Jak to obejít?
Toto omezení je možné obejít tak, že se reklama vloží do stránky pomocí externího JavaScriptu. Tzn. pokud máte tag <object> nebo <embed> přímo ve stránce, tak daný objekt bude zcela jistě neaktivní - prohlédněte si příklad, ve kterém je flash přímo ve stránce.
Řešení 1 - vložení objektu přes externí skript
Pokud je do stránky ActiveX objekt vložen z externího javascriptu, tak vše funguje bez problému. Vyzkoušejte si funkční příklad.
<!-- HTML stránka -->
<html>
<body>
<script type="text/javascript" src=\"embed.js\"></script>
</body>
</html>
// externí javascript
document.write('<embed src=\"flash.swf\"></embed>');
Řešení 2 - externí znovu vložení pomocí outerHTML nebo innerHTML
Pokud je daný flash ve stránce "natvrdo", je možné ho znovu vložit pomocí externího JavaScriptu. S tímto řešením přišel David Grudl, které popisuje na svém blogu. Do stránky jednoduše nalinkujete externí javascript, který se načte pouze v IE (podmíněné komentáře) a až po načtení HTML kódu stránky (vlastnost defer) se v cyklu projdou veškeré objekty a znovu se vloží. Vyzkoušejte si funkční příklad.
<!-- HTML stránka -->
<html>
<head>
<!--[if IE]>
<script type="text/javascript" src="fix_eolas.js" defer="defer"></script>
<![endif]-->
</head>
<body>
<embed src=\"flash.swf\"></embed>
</body>
</html>
Aby skript byl opravdu univerzální, tak jsem ho musel drobně rozšířit (stáhnout):
var aXobjects = new Array(\"object\",\"embed\",\"applet\");
for (var x=0; x<aXobjects.length; x++) {
var objects = document.getElementsByTagName(aXobjects[x]);
for (var i=0; i<objects.length; i++) {
objects[i].outerHTML = objects[i].outerHTML;
}
}
Dále je nutné si dát pozor na správně nastavenou cache na serveru, protože pokud by daný soubor nebyl správně uložen u klienta, tak by se po znovu vložení opět stahoval ze serveru.
Je nepříjemné, že odstranit toto omezení jde pouze pomocí externího skriptu, tudíž pokud obsah výše uvedeného skriptu vložíte inline na konec stránky, tak i po jeho vykonání budou objekty stále neaktivní. Nicméně řešení existuje, není to sice nic hezkého, ale mohlo to být horší.
20.04.2006 | Rubrika: JavaScript | Trvalý odkaz | 20 komentářů »




