www.bimminger.at

Tipps / Internet

Internet

Fokus auf Flash Elemente ohne "Click to activate"


Leider ist seit der Version 7 des Internet Explorer eine Hürde für das aktivieren von Flash-Anwendungen eingeführt worden. Es betrifft außerdem nicht nur Flash-Anwendungen sondern auch alle anderen via Object-Tag eingebundenen Elemente. Das ganze nur wegen einem Patent der Firma Eolas.

Früher war es ohne weiteres möglich dass man über ein Flash-Objekt fährt und es dadurch automatisch aktiviert. Jetzt benötigt man einen kleinen Trick dazu. Ein einfach im Source-Code eingebettetes Element muss man einfach durch ein externes Javascript neu laden. Es gibt unzählige Beispiele im Netz aber ich habe auf die Schnelle kein für mich funktionierendes gefunden, darum habe ich mir schnell selbst eines erstellt.

Zuerst eine eigene Datei z.Bsp. mit dem Namen fixobjectactivation.js anlegen. Die beinhaltet dann folgendes Script:

/*
* Fix für das Problem "Click to activate control"
*
* @version: 2007-11-21
* @author: Andreas Bimminger <andreas@bimminger.at>
*/

//Nur wenn outerHTML und ElementsByTagName unterstützt wird
function fixFlashActivation() {
var htmlString = null;
var htmlStringInner = null;
var suchergebnis = null;
var alleObjects = null;
var oneObject = null;

//Nur wenn getElementsByTagName und outerHTML unterstützt wird
if (document.getElementsByTagName && document.body.outerHTML) {
alleObjects = document.getElementsByTagName("object");
//Alle Objekte abarbeiten
for (var i = 0; i < alleObjects.length; i++) {
oneObject = alleObjects[i];
//Nur klar definierte Objekte abarbeiten (class="fixflashactivation")
if(oneObject.className.match(/^fixflashactivation$/)) {
htmlString = oneObject.outerHTML;
suchergebnis = htmlString.match(/</g);

//Existieren Kind-Elemente sind aber im outerHTML nur max. zwei Tags offen ( ) //Das betrifft halt vor allem den Verursacher des Problems den IE if(oneObject.hasChildNodes() == true && suchergebnis.length < 3) { //... dann müssen die Kindelemente wieder hinzu htmlStringInner = ""; for(var j = 0; j < oneObject.childNodes.length; j++) { htmlStringInner += oneObject.childNodes[j].outerHTML; } //Verschachtelte Unterelemente werden allerdings einfach ignoriert alleObjects[i].outerHTML = htmlString.replace('>', '>' + htmlStringInner); } else { //ansonsten einfach alles übernehmen alleObjects[i].outerHTML = htmlString; } } } } } //Damit der IE nicht Probleme beim laden bekommt: // (Noch 2 Elemente) Auf ... wird gewartet. window.setTimeout("fixFlashActivation()", 200);

Dieses Skript ersetzt einfach alle object-Tags mit dem class-Attribut fixflashactivation. Damit kann man hier auch noch etwas gegensteuern wenn mehrere Objekte eingesetzt werden.

Dann muss dieses Skript nur noch am Ende der entsprechenden HTML-Seite eingebunden werden. Am besten knapp vor dem Body-Tag.

<script type="text/javascript" src="fixobjectactivation.js"></script>


Das ganze hat bei mir mit dem Internet Explorer 6 und 7 sowie mit Opera 9 und auch mit Firefox funktioniert. Wobei letzterer ja eigentlich kein Problem mit diesem Patent hat.


Um einen Diskussionsbeitrag zu posten müssen Sie eingeloggt sein.