2009-06-24 18 views
19

Estoy intentando habilitar la comunicación entre Javascript y Flash a través de ExternalInterface entre dominios. El Javascript funciona bien cuando está ubicado en el mismo dominio que el SWF. Sin embargo, en un caso, el código HTML reside en el dominio A, el javascript y el flash ambos residen en el dominio B. He hecho todo lo siguiente:Cross Domain ExternalInterface "Método de llamada de error en NPObject"

  • La etiqueta embed tiene allowScriptAccess="always" (y el objeto tiene que, como param) actionscipt
  • Mi de archivo SWF tiene Security.allowDomain("*")
  • Mi SWF pide asimismo Security.allowInsecureDomain("*")
  • Tanto el dominio a y el dominio B tienen un archivo que tiene /crossdomain.xmlallow-access-from domain="*"

El SWF es capaz de llamar a javascript en la página, pero cuando se utiliza Javascript para llamar a funciones expuestas por ExternalInterface, me sale

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

Ésta es ActionScript 2, de modo ExternalInterface.marshallExceptions no está disponible.

+0

¿Está cargando más de un swf? ¿O es un swf en el dominio A (con el HTML) cargando su swf en el dominio B? –

+0

Alex - Buen punto, no lo mencioné. El javascript del dominio B carga un SWF del dominio B, y ese SWF carga un segundo SWF del dominio B. Esta carga parece funcionar, pero no puedo estar seguro porque no puedo interactuar con el SWF. – Josh

Respuesta

20

sólo necesitará dos cosas para que esto funcione:

1) allowscriptaccess=always le permitirá a su swf a enviar cosas a la página

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

Tenga en cuenta que es System.security.allowDomain() en AS2 - no es lo mismo que AS3 o lo que ha escrito anteriormente.

número 2 anterior permite a la página html en domainA llamar cosas en el swf en domainB.

El dominio en el que está hospedado su js no tendrá importancia aquí, ya que el navegador lo incluye en el dominio A, el script se ejecuta en domainA.

crossdomain.xml es principalmente para cargar archivos remotos, lo que no está haciendo, por lo que puede eliminarlo si lo desea. (y probablemente no desee tener un archivo crossdomain.xml con allow="*" sentado en su dominio principal, eso es una mala práctica)

+1

cosa extraña. Mi SWF y JS/HTML están en la misma página, pero esta excepción todavía está presente :( – DataGreed

1

Dado que está cargando varios swfs, puede que necesite incluir la configuración de seguridad en cada uno de esos swfs en el dominio B que se cargan.

Es posible que también necesite un contexto de cargador con la configuración de seguridad adecuada.

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

Hola, tengo el mismo problema, cada vez que intento ingresar algo que no sea NULL en el dominio de seguridad, aparece un error: Error # 2114: el parámetro LoaderContext.securityDomain debe ser nulo. ¿Alguna sugerencia? –

0

Tuve el mismo problema (allowDomain etc. fueron buenos), pero envié a flash el parámetro incorrecto - solo superado JSON desde la llamada ajax. Se acabó el problema cuando puse ese json en "" y luego lo analicé en un objeto javascript (a través de jQuery.parseJSON).

1

para mí unos cuantos razón era (estoy usando uploadify):

servidor HTTP no tiene permiso para escribir en el archivo de destino swfobject (flash) no han cruzado el acceso al dominio solución

: etiqueta de objeto en hTML debe tener allowScriptAccess = "siempre" se puede hacer por el conjunto parámetro como

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

se puede hacer por la fuente de compilación con este parámetro, tengo que, si usted lo necesita escribir a mí con Cargar tema. Que servidor remoto, donde el flash incluir en la página, hay que tener en el archivo crossdamoin.xml raíz con contenidos como:

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

En mi caso, era porque yo estaba modificando el elemento DOM que contiene el div cargador.

Utilicé la función jquery hide() para ocultar el div que contiene el cargador, y cuando me di cuenta de que había causado el error anterior, probé un enfoque diferente donde establecí el atributo "flotante" del div. En ambos casos, rompió la carga.

FWIW, parece que al establecer el ancho/alto del div que contiene el cargador ascendente en 0 NO se produce el error.

+1

n.b., Flash es consciente de cuándo está visible, por lo que una película invisible a través del DOM puede detener la ejecución de Flash inmediatamente. –

Cuestiones relacionadas