Wie nennen dynamisch erstellte flash-externe Schnittstelle im IE mit javascript?
Was ich habe:
- Eine swf exportiert eine Funktion, über ExternalInterface
- Javascript erstellt neue embed-Objekt und fügt es auf das Dokument
- Aufrufen von flash-Funktionen funktioniert in anderen Browsern
- Aufrufen von flash-Funktionen nicht in IE 8
Beispiel für den Export von Funktionen in swf:
flash.external.ExternalInterface.addCallback("isActive", ...
Beispiel erstellen Sie den embed-Objekt:
var b = document.createElement('embed');
b.type = 'application\u002fx-shockwave-flash';
b.setAttribute('allowFullScreen', 'true');
b.setAttribute('allowNetworking', 'all');
b.setAttribute('allowScriptAccess', 'always');
b.width = 500;
b.height = 400;
b.src = 'assets\u002fUltra4.UltraApplication\u002fUltra4.UltraApplication+UltraSprite.swf';
Beispiel des aufrufenden flash externe Schnittstelle in javascript:
try
{
e = b.isActive();
}
catch (__exc){ }
Im IE wird es zu fangen mit Nachricht "Objekt unterstützt diese Eigenschaft oder Methode nicht"
Wie es zu lösen ist?
- Verwandte: http://bojolais.livejournal.com/251383.html
- Verwandte: ExternalInterface funktioniert nicht im IE
- Verwandte: http://swfupload.org/forum/generaldiscussion/985
- Verwandte: http://code.google.com/p/doctype/wiki/ArticleFixingFlashExternalInterface
- Verwandte: http://www.dangerouslyawesome.com/2006/10/20/another-swfobject-problem-deproblemed/
- Verwandte: http://www.airtightinteractive.com/news/?p=71
In der script-debugger kann ich sehen, ein Dritter Skript soll die Brücke:
function __flash__arrayToXML(obj) {
var s = "<array>";
for (var i=0; i<obj.length; i++) {
s += "<property id=\"" + i + "\">" + __flash__toXML(obj[i]) + "</property>";
}
return s+"</array>";
}
function __flash__argumentsToXML(obj,index) {
var s = "<arguments>";
for (var i=index; i<obj.length; i++) {
s += __flash__toXML(obj[i]);
}
return s+"</arguments>";
}
function __flash__objectToXML(obj) {
var s = "<object>";
for (var prop in obj) {
s += "<property id=\"" + prop + "\">" + __flash__toXML(obj[prop]) + "</property>";
}
return s+"</object>";
}
function __flash__escapeXML(s) {
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
}
function __flash__toXML(value) {
var type = typeof(value);
if (type == "string") {
return "<string>" + __flash__escapeXML(value) + "</string>";
} else if (type == "undefined") {
return "<undefined/>";
} else if (type == "number") {
return "<number>" + value + "</number>";
} else if (value == null) {
return "<null/>";
} else if (type == "boolean") {
return value ? "<true/>" : "<false/>";
} else if (value instanceof Date) {
return "<date>" + value.getTime() + "</date>";
} else if (value instanceof Array) {
return __flash__arrayToXML(value);
} else if (type == "object") {
return __flash__objectToXML(value);
} else {
return "<null/>"; //???
}
}
function __flash__addCallback(instance, name) {
instance[name] = function () {
return eval(instance.CallFunction("<invoke name=\""+name+"\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments,0) + "</invoke>"));
}
}
function __flash__removeCallback(instance, name) {
instance[name] = null;
}
- Ich habe externe interface im IE - schwer zu sagen, alles, ohne dass der code aber.
- Die anwser mit Quellcode-Beispiel erstellen Sie einfach ein embed-html-element über dom-Funktionen in javascript und dann beweisen die externe Schnittstelle aufgerufen werden können. Meine Erfahrung ist, DH nicht gebunden werden die javascript, um flash-Brücke aus irgendeinem Grund. Vielleicht sollte ich post ein Fehler auf microsoft connect? 🙂
- Ich habe in der Vergangenheit gesehen, können Sie am Ende mit einer race condition bei der Einrichtung der externen Schnittstelle, nicht sicher, ob der IE8 macht es noch schlimmer, die SetCallback Funktion noch nicht aufgerufen wurde, durch die Zeit, das Skript interagiert mit dem DOM-Objekt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mir nicht sicher, ob ich verstehe Ihre Frage richtig. Aber ich denke, dir fehlen ein paar Dinge:
1) Ihre embed-tag muss ein name-Attribut. Nennen wir es "NewFlashMovie" für den nachfolgenden code:
2) müssen Sie rufen Sie das "isActive" - Funktion anders als mit einer externen Funktion. Fügen Sie zunächst diese Funktion
Dann können Sie rufen Sie die Funktion wie folgt
thisMovie("NewFlashMovie").isActive();
Aus meiner Erfahrung, diese "thisMovie" ist unerlässlich, um der Brücke die IE-Flash-Anrufe. Dies dokumentiert sich auch in der ExternalInterface-Dokumentation
3) ich empfehle auch die Verwendung swfobject statt der Erstellung Ihrer eigenen "embed" Objekt.
Hoffe diese hilft.
Habe ich festgestellt, dass für den IE, den Aufruf von Javascript-ActionScript, die ich brauchte, um die Versorgung einer "id" - Attribut, um die Objekt tag. Der IE Art des Umgangs mit ExternalInterface.rufen Sie(...) ist der Aufruf einer Methode auf die Objekt. IE Themen der code
Ohne ein id-Attribut auf das Objekt-tag, das reduziert sich auf
die versucht zu rufen SetReturnValue auf ein null-Objekt.
Beachten Sie, dass das Attribut "id" ist nicht erforderlich, für andere Browser, aber nicht wirklich verletzt.
Etwas ähnliches geschieht, kann in deinem Fall: Vielleicht ein "name" - Attribut auf die einbetten kann helfen.
Könnte dies zu tun mit der Tatsache, dass Ihr schaffen ein Embed-tag statt einem Object-tag? IE traditionell verwendet Object-tags zum einbetten von Flash-Inhalten
Finden Sie auf der Adobe tech nicht zur Diskussion: http://kb2.adobe.com/cps/415/tn_4150.html