2009-06-24 11 views
19

Ich versuche, die Kommunikation zwischen Javascript und Flash über ExternalInterface über Domänen hinweg zu ermöglichen. Das Javascript funktioniert großartig, wenn es sich in derselben Domäne wie die SWF befindet. Aber in einem Fall befindet sich die HTML-Datei auf Domäne A, die Javascript und das Flash-residieren sowohl auf Domain B. Ich habe alle folgenden getan:Cross Domain ExternalInterface "Fehler beim Aufrufen der Methode auf NPObject"

  • Die embed-Tag hat allowScriptAccess="always" (und das Objekt hat, dass als param)
  • Meine SWF-Datei actionscipt hat Security.allowDomain("*")
  • Meine SWF ruft auch Security.allowInsecureDomain("*")
  • Beide Domäne A und Domäne B haben eine /crossdomain.xml Datei, die allow-access-from domain="*"
hat

Die SWF ist in der Lage Javascript auf der Seite zu nennen, aber wenn ich Javascript verwenden Funktionen von ExternalInterface ausgesetzt rufen, ich

Error calling method on NPObject! [plugin exception: Error in Actionscript. Use a try/catch block to find error.]

Dies ist Actionscript 2 so ExternalInterface.marshallExceptions ist nicht verfügbar.

+0

Laden Sie mehr als ein swf? Oder ist ein swf auf Domain A (mit dem HTML) laden Sie Ihre swf auf Domain B? –

+0

Alex - Guter Punkt, das habe ich nicht erwähnt. Das JavaScript aus Domäne B lädt eine SWF aus Domäne B und die SWF lädt eine zweite SWF aus Domäne B. Dieses Laden scheint zu funktionieren, aber ich kann nicht sicher sein, da ich nicht mit der SWF interagieren kann. – Josh

Antwort

20

Sie sollten nur noch zwei Dinge für diese arbeiten:

1) allowscriptaccess=always können Ihre swf Zeug zur Seite

2) System.security.allowDomain("yourhtmldomain.com");

Hinweis senden, dass es System.security.allowDomain() in AS2 - es ist nicht das gleiche wie AS3 oder was Sie oben geschrieben haben.

Nummer 2 oben erlaubt der HTML-Seite auf DomainA Dinge in der SWF auf DomainB zu nennen.

Die Domäne, auf der Ihre js gehostet wird, spielt hier keine Rolle, da der Browser sie in domainA einbettet, wird das Skript in domainA ausgeführt.

crossdomain.xml ist hauptsächlich nur zum Laden von entfernten Dateien, die Sie nicht tun, so können Sie das entfernen, wenn Sie möchten. (und Sie wahrscheinlich keine crossdomain.xml Datei mit allow="*" sitzen auf Ihrer Hauptdomain haben wollen, das ist sehr schlechte Praxis)

+1

seltsame Sache. Meine SWF und JS/HTML sind beide auf der gleichen Seite, aber diese Ausnahme ist immer noch vorhanden :( – DataGreed

1

Da Sie mehrere SWFs laden, müssen Sie möglicherweise die Sicherheitseinstellungen in jedem dieser swfs auf Domäne B, die geladen werden, einschließen.

Möglicherweise benötigen Sie auch einen Loader-Kontext mit den entsprechenden Sicherheitseinstellungen.

import flash.system.LoaderContext; 
import flash.system.ApplicationDomain; 
import flash.system.Security; 
import flash.system.SecurityDomain; 
import flash.net.URLRequest; 
import flash.net.URLLoader; 

var context:LoaderContext = new LoaderContext(true, ApplicationDomain.currentDomain, (Security.sandboxType == Security.REMOTE) ? SecurityDomain.currentDomain : null); 
var l:Loader = new Loader(); 
l.load(new URLRequest("http://example.com/myswf.swf"), context); 
+0

Hallo, ich habe das gleiche Problem, wenn ich versuchte, etwas anderes als NULL in Sicherheitsdomäne einzugeben, bekomme ich einen Fehler: Fehler # 2114: Parameter LoaderContext.securityDomain muss null sein. Irgendwelche Vorschläge? –

0

Ich hatte das gleiche Problem (allowDomain usw. waren gut), aber ich sende Flash-Parameter - nur JSON aus Ajax Anruf outputed. Das Problem ist vorbei, als ich dieses json in "" gesetzt habe und es dann in Javascript-Objekt (über jQuery.parseJSON) analysiert habe.

1

für mich ein paar Grund war (ich verwende Uploadify):

http-Server haben keine Berechtigung Datei zum Ziel swfobject (Flash) haben keine Cross-Domain-Zugriff

Lösung zu schreiben: Objekt-Tag in hTML muss allowScriptAccess = „always“ durch ParamSetzen getan werden kann, wie

$('#file_upload').uploadifySettings('scriptAccess', 'always') 
than flash object must have: 
import flash.system.Security; 
Security.allowDomain('remotedomain.com'); 

es durch Kompilierung Quelle mit diesem param getan werden kann, ich habe, dass, wenn Sie es mir schreiben müssen mit hochladen Gegenstand. als Remote-Server, auf den Blitz in der Seite enthält, wie in der Wurzel crossdamoin.xml Datei mit Inhalt haben muss:

<?xml version="1.0"?> 
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> 
0

In meinem Fall war es, weil ich das DOM-Element wurde Modifizieren der Uploader div enthält.

Ich habe die Funktion jquery hide() verwendet, um das div mit dem Uploader zu verstecken, und als ich erkannte, dass der obige Fehler verursacht wurde, versuchte ich einen anderen Ansatz, wo ich das "float" -Attribut des div. In beiden Fällen hat es den Uploader zerstört.

FWIW, es scheint, dass die Einstellung der Breite/Höhe des div mit dem Uploader auf 0 nicht den Fehler auftritt.

+1

n.b., Flash ist sich dessen bewusst, wenn es sichtbar ist, also kann die Flash-Ausführung sofort gestoppt werden, wenn ein Film durch das DOM unsichtbar gemacht wird. –