2009-06-24 17 views
19

Sto tentando di abilitare la comunicazione tra Javascript e Flash tramite ExternalInterface tra domini. Javascript funziona alla grande quando si trova nello stesso dominio del file SWF. Ma in un caso, il codice HTML risiede sul dominio A, il javascript e il flash sia risiedono sul dominio B. Ho fatto tutti i seguenti:Cross Domain ExternalInterface "Metodo di chiamata errore su NPObject"

  • Il tag embed ha allowScriptAccess="always" (e l'oggetto ha che da param) actionscipt
  • mio file SWF ha Security.allowDomain("*")
  • mio SWF chiede inoltre Security.allowInsecureDomain("*")
  • Sia dominio a e il dominio B hanno un file /crossdomain.xml che ha allow-access-from domain="*"

Lo SWF è in grado di chiamare javascript sulla pagina, ma quando uso Javascript per richiamare le funzioni esposte da ExternalInterface, ottengo

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

Questo è ActionScript 2 in modo ExternalInterface.marshallExceptions non è disponibile.

+0

Stai caricando più di uno swf? O è un swf sul dominio A (con l'HTML) che carica il tuo SWF sul dominio B? –

+0

Alex - Ottimo punto, non l'ho menzionato. Il javascript del dominio B carica un SWF dal dominio B e tale SWF carica un secondo SWF dal dominio B. Questo caricamento sembra funzionare ma non posso essere sicuro perché non riesco a interagire con il file SWF. – Josh

risposta

20

dovrebbe essere necessario solo due cose per far funzionare tutto questo:

1) allowscriptaccess=always permetterà il file SWF di inviare roba alla pagina

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

Si noti che si tratta di System.security.allowDomain() in AS2: non è lo stesso di AS3 o di quello che hai scritto sopra.

numero 2 sopra consente alla pagina html sul dominioA di chiamare le cose nel swf sul dominioB.

Il dominio su cui js è ospitato non ha importanza qui, poiché il browser lo incorpora in dominioA, lo script viene eseguito in dominioA.

crossdomain.xml è principalmente solo per caricare file remoti, cosa che non si sta facendo, quindi è possibile rimuoverlo se lo si desidera. (e probabilmente non vuoi avere un file crossdomain.xml con allow="*" seduto sul tuo dominio principale, è una pessima pratica)

+1

strana cosa. Il mio SWF e JS/HTML sono entrambi sulla stessa pagina, ma questa eccezione è ancora presente :( – DataGreed

1

Poiché si caricano più swfs, potrebbe essere necessario includere le impostazioni di sicurezza in ciascuno di quegli swfs sul dominio B che sono stati caricati.

Potrebbe anche essere necessario un contesto di caricamento con le impostazioni di sicurezza appropriate.

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

Ciao, ho lo stesso problema, ogni volta che ho provato a inserire qualcosa di diverso da NULL nel dominio di sicurezza ottengo un errore: Errore # 2114: il parametro LoaderContext.securityDomain deve essere nullo. Qualche suggerimento? –

0

Ho avuto lo stesso problema (allowDomain ecc. Erano buoni), ma invio parametri flash non validi - ho appena emesso JSON da una chiamata Ajax. Problema andato, quando ho messo quel json in "", e quindi analizzarlo in oggetto javascript (tramite jQuery.parseJSON).

1

per me qualche motivo era (sto usando uploadify):

server HTTP non ha il permesso di scrivere il file di destinazione SWFObject (flash) non hanno accesso croce dominio

soluzione: tag Object in html deve avere allowScriptAccess = "always" può essere fatto da set param come

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

può essere fatto per fonte di compilazione con questo parametro, ho che, se ne avete bisogno di scrivere a me con uploadify soggetto. Than server remoto, in cui il flash includere nella pagina, deve avere nel file crossdamoin.xml radice con contenuti come:

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

Nel mio caso, era perché stavo modificando l'elemento DOM che contiene il div uploader.

Ho usato la funzione jquery hide() per nascondere il div contenente l'uploader, e quando ho capito che ha causato l'errore di cui sopra, ho provato un approccio diverso in cui ho impostato l'attributo "float" del div. In entrambi i casi, ha rotto l'uploader.

FWIW, sembra che l'impostazione della larghezza/altezza del div contenente l'uploader su 0 NON comporti l'errore.

+1

n.b., Flash è a conoscenza di quando è visibile, quindi rendere invisibile un film attraverso il DOM può bloccare immediatamente l'esecuzione di Flash. –