• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Flash & External Interface & IE

Knautschke

New member
Hi.
War mir nicht sicher ob das Thema hierhin gehört oder in den JS-Teil.

Folgende Situation:
Habe mehrere Flash-Apps auf meiner Seite, bei denen ich herausfinden wollte wann sie den Fokus verlieren. An sich kein Prob, aber das klappt ja nur wenn man die SWF-Dateien mit dem "wmode" tag auf "window" gesetzt einbindet. Das wiederum beißt sich mit der restlichen Seite, da sich dann die Flash-App in den Vordergrund drängt, vor diverse andere Navigations-Elemente.

Also registriere ich das "außerhalb der App-Klicken" per JS, und schicke das dann an eine mit dem External Interface definierte Funktion in den Flash-Apps, damit sie eben tun was sie tun sollen wenn der Fokus weg ist.

Im Firefox klappt das. der Internet Explorer jedoch beschwert sich über "[object Error]"s. Ich ging zunächst davon aus, dass er per "document.getElementbyID" die SWF-Dateien nicht finden kann, aber nach einiger Testerei (wieviel Zeit das frisst!) habe ich herausgefunden, dass das nicht der Grund sein wird.

Jemand meinte dann, es gäbe wohl manchmal Probleme mit dem External Interface und dem IE. Leider habe ich dazu nichts konkreteres gefunden.

Falls jemand eine Idee hätte wäre das praktisch. :)
 
1. Es heißt document.getElementById - JS ist case-sensitive.
2. Ohne Testseite oder Code können wir dir nicht weiterhelfen.
 
Hi.
Ach so ja, "document.getElementById" hatte ich im eigentlichen Code schon richtig geschrieben, daran liegt es nicht.

Also, diesmal mit an den Beitrag angehängter Datei:
Ich habe ein in JS (offensichtlich nicht von mir) programmiertes Akkordeon-Modul. Klickt jemand auf ein bestimmtes Element des Moduls, dann klapp das auf, der darin befindliche Inhalt wird sichtbar und der Rest verdeckt.
Ich möchte, dass wenn jemand auf ein Element des Akkordeons klickt, alle sich in den anderen Elementen befindlichen Flash-Anwendungen aufhören ihr Ding zu drehen.

Dazu schrieb fügte ich zu dem Akkordeon-JS-Code folgende Zeilen hinzu (Zeile 9-22, bezogen auf die angehängte Datei):
Code:
var s1flash_is_ready = false;
		
function onFlashReady() {
	s1flash_is_ready = true;
	if(s1flash_is_ready) { thisMovie("swf1").losingFocus('just testing'); }
}
		
function thisMovie(movieName) {
	 if (navigator.appName.indexOf("Microsoft") != -1) {
		 return window[movieName];
	 } else {
		 return document[movieName];
	 }
}

Sobald die Flash-Anwendung fertig geladen wurde, ruft sie die JS-Funktion "onFlashReady()" auf, damit JS weiß wann man Funktionen der Flash-Anwendung aufrufen kann. Zeile 13 habe ich nur als Test eingefügt, um zu sehen ob die Kommunikation zwischen JS und IE grundsätzlich funktioniert (geht auch, in Firefox und IE).

Bei Klick auf ein Element des Akkordeons wird mit folgendem Code die Flash-Funktion aufgerufen (Zeile 207 in der angehängten Datei):
Code:
if(s1flash_is_ready) { thisMovie("swf1").losingFocus('focusLost'); }

Im Firefox funktioniert es, der IE gibt einen unbekannten Fehler aus.
Der Code an sich scheint zu stimmen, da der Code aus Zeile 207 ja funkioniert, packe ich ihn in die "onFlashReady()" Funktion. Packe ich ihn an seine Position in Zeile 207, dann bekomme ich "unbekannte Fehler" (IE) oder, per alert() ausgegeben, einen "[object Error]". Im Firefox funktioniert das alles wie gewünscht.

Ich dachte zunächst, dass vielleicht in Zeile 207 bei dem Aufruf die Flash-Datei nicht mehr gefunden wird, aber als ich das nachgeprüft habe stellte sich diese Vermutung als falsch heraus. Von daher scheint der Fehler direkt durch den Aufruf der per "addCallback()" in der Flash-Anwendung freigegebenen Funktion ausgelöst zu werden. Warum auch immer.

Freue mich über Hinweise zur Ergreifung der Fehlerursache.


Edit:
Der Microsoft-Debugger meint es würde an folgender Funktion liegen:
Code:
function __flash__addCallback(instance, name) {
  instance[name] = function () { 
    return eval(instance.CallFunction("<invoke name=\""+name+"\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments,0) + "</invoke>"));
  }
}

Zu dem Thema hatte ich auch folgenden Beitrag gefunden:
I found yet another IE bug related to this topic. After a page is cached by IE and reloaded, the SWF is loaded before it's embedded, so any callback functions the the SWF tries to setup when it loads (like the JS->Flash ExternalInterface code) will fail with an error "objectID" is undefined. Then when you try to use the callback function you get Object doesn't support this property or method because the functions didn't get assigned to the Flash object properly.
The solution is to put this line above your SWF Object code, or object element.
"window["objectid"] = new Object();"
Replace objectid with the id that you've given your SWF Object.


Habe ich auch ausprobiert. Im Firefox funktionierts (wie immer), der IE hat die Fehlermeldung geändert zu: "Fehler: Das Objekt unterstützt diese Eigenschaft oder Methode nicht."
Scheint sich außerdem auch auf IE6 zu beziehen, ich benutz 8.
 

Anhänge

  • s7_horizontal_accordion.zip
    1,9 KB · Aufrufe: 0
Zuletzt bearbeitet:
Zurück
Oben