2009-06-24 13 views
19

J'essaie d'activer la communication entre Javascript et Flash via ExternalInterface entre les domaines. Le Javascript fonctionne bien quand il est situé sur le même domaine que le SWF. Mais dans un cas, le code HTML se trouve sur le domaine A, le javascript et le flash résident sur le domaine B. Je l'ai fait toutes les conditions suivantes:Cross Domain ExternalInterface "Méthode d'appel d'erreur sur NPObject"

  • La balise embed a allowScriptAccess="always" (et l'objet a que comme param)
  • mon actionscipt de fichier SWF a Security.allowDomain("*")
  • Mon SWF appelle également Security.allowInsecureDomain("*")
  • deux domaine a et le domaine B ont un fichier /crossdomain.xml qui a allow-access-from domain="*"

Le SWF peut appeler javascript sur la page, mais quand j'utiliser JavaScript pour appeler des fonctions exposées par ExternalInterface, je reçois

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

C'est ActionScript 2 si ExternalInterface.marshallExceptions n'est pas disponible.

+0

Chargez-vous plus d'un swf? Ou est-ce un swf sur le domaine A (avec le HTML) qui charge votre swf sur le domaine B? –

+0

Alex - Bon point, je n'ai pas mentionné ça. Le javascript du domaine B charge un fichier SWF du domaine B et ce fichier SWF charge un second fichier SWF du domaine B. Ce chargement semble fonctionner mais je ne peux pas en être sûr car je ne peux pas interagir avec le fichier SWF. – Josh

Répondre

20

Vous ne devriez avoir besoin de deux choses pour que cela fonctionne:

1) allowscriptaccess=always permettra à votre swf d'envoyer des trucs à la page

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

Notez qu'il est System.security.allowDomain() dans AS2 - ce n'est pas la même chose que AS3 ou ce que vous avez écrit ci-dessus.

Le numéro 2 ci-dessus permet à la page html sur le domaine A d'appeler des choses dans le swf sur le domaineB.

Le domaine sur lequel votre js est hébergé n'aura pas d'importance ici, puisque le navigateur l'intègre sur le domaine A, le script est exécuté dans domainA. Crossdomain.xml est principalement uniquement pour le chargement de fichiers distants, ce que vous ne faites pas, donc vous pouvez le supprimer si vous le souhaitez. (Et vous ne voulez probablement pas avoir un fichier crossdomain.xml avec allow="*" assis sur votre domaine principal, c'est une très mauvaise pratique)

+1

chose étrange. Mon SWF et JS/HTML sont tous les deux sur la même page, mais cette exception est toujours présente :( – DataGreed

1

Étant donné que vous chargez plusieurs swfs, vous devrez peut-être inclure les paramètres de sécurité dans chacun des swfs du domaine B qui sont chargés.

Vous pouvez également avoir besoin d'un contexte de chargeur avec les paramètres de sécurité appropriés.

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

Salut, j'ai le même problème, chaque fois que j'ai essayé d'entrer quelque chose d'autre que NULL dans le domaine de la sécurité, je reçois une erreur: Erreur # 2114: Paramètre LoaderContext.securityDomain doit être null. Des suggestions? –

0

J'ai eu ce même problème (allowDomain etc. étaient bons), mais j'envoie au paramètre mauvais flash - juste sorti JSON de l'appel d'ajax. Problème disparu, quand j'ai mis ce json dans "", puis l'analyser en objet javascript (via jQuery.parseJSON).

1

pour moi quelques raisons était (j'utilise Uploadify):

serveur http pas l'autorisation d'écrire dans le fichier à destination swfobject (flash) ont pas accès interdomaines

solution

: balise d'objet en html doit avoir allowScriptAccess = « always » il peut être fait par jeu param comme

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

il peut être fait par la source de la compilation avec ce param, je dois, si vous en avez besoin me écrire à télécharger sujet. Than serveur à distance, où le flash inclut dans la page, doit avoir dans le fichier crossdamoin.xml racine avec un contenu comme:

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

Dans mon cas, ce fut parce que je modifiait l'élément DOM contenant le téléchargeur div. J'ai utilisé la fonction jquery hide() pour masquer la div contenant l'uploader, et quand j'ai réalisé que cela causait l'erreur ci-dessus, j'ai essayé une approche différente où j'ai mis l'attribut "float" du div. Dans les deux cas, il a cassé l'uploader. FWIW, il semble que la définition de la largeur/hauteur de la div contenant l'uploader à 0 ne provoque PAS l'erreur.

+1

n.b., Flash est conscient du moment où il est visible, donc rendre un film invisible via le DOM peut stopper immédiatement l'exécution de Flash. –