javascript flash actionscript-2 externalinterface

javascript - Cross Domain ExternalInterface "Error al llamar al método en NPObject"



flash actionscript-2 (6)

Estoy intentando habilitar la comunicación entre Javascript y Flash a través de ExternalInterface a través de dominios. El Javascript funciona muy bien cuando se encuentra en el mismo dominio que el SWF. Pero en un caso, el HTML reside en el dominio A, el javascript y la memoria flash residen en el dominio B. He hecho todo lo siguiente:

  • La etiqueta incrustada tiene allowScriptAccess="always" (y el objeto tiene eso como parámetro)
  • El archivo actionscipt de mi archivo SWF tiene Security.allowDomain("*")
  • Mi SWF también llama a Security.allowInsecureDomain("*")
  • Tanto el dominio A como el dominio B tienen un archivo /crossdomain.xml que tiene allow-access-from domain="*"

El SWF puede llamar a javascript en la página, pero cuando uso Javascript para llamar a las funciones expuestas por ExternalInterface, obtengo

Error al llamar al método en NPObject! [excepción del plugin: Error en Actionscript. Use un bloque try / catch para encontrar el error.]

Esto es ActionScript 2, por lo que ExternalInterface.marshallExceptions no está disponible.



Debido a que está cargando varios swfs, es posible que deba incluir la configuración de seguridad en cada uno de esos swfs en el dominio B que están cargados.

También es posible que 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);


En mi caso, fue porque estaba modificando el elemento DOM que contenía el div uploader.

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

FWIW, parece que establecer el ancho / alto del div que contiene el cargador en 0 no hace que se produzca el error.


Para mí, algunas razones fue (estoy usando uploadify):

El servidor http no tiene permiso para escribir el archivo en el destino swfobject (flash) no tiene acceso cruzado al dominio

solución: la etiqueta de objeto en html debe tener allowScriptAccess = "siempre" se puede hacer configurando param como

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

Se puede hacer compilando la fuente con este parámetro, tengo que, si lo necesita, escríbame con el tema de uploadify. El servidor remoto, donde se incluye Flash en la página, debe tener en la raíz el archivo crossdamoin.xml con contenido como:

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


Solo necesitas dos cosas para que esto funcione:

1) allowscriptaccess=always permitirá que su swf envíe material 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.

el número 2 anterior permite que la página html en el dominio A llame a cosas en el swf en el dominioB.

El dominio en el que está alojado su js no importará aquí, ya que el navegador lo incrusta en el dominio A, el script se ejecuta en el dominio A.

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


Tuve este mismo problema (allowDomain, etc., fue bueno), pero lo envié a flash de parámetros incorrectos: solo hice salir JSON de la llamada ajax. El problema desapareció, cuando puse ese json en "" y luego lo analicé en el objeto javascript (a través de jQuery.parseJSON).