Question

Mon simple ActionScript J'essaie d'utiliser la ExternalInterface de Flash pour configurer un rappel afin que JavaScript puisse appeler une méthode sur mon objet Flash. Tout fonctionne bien dans Safari, Firefox et IE, mais je ne parviens pas à faire fonctionner Chrome. Lorsque j'essaie le code sur Chrome, le message d'erreur suivant s'affiche:

  

Uncaught TypeError: Object # < an   HTMLObjectElement & Gt; n'a pas de méthode   'setText'

Voici l'exemple HTML que j'utilise (encore une fois, cela fonctionne très bien dans Safari, FF et IE)

<html><body>
<div id="mycontent"></div>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>
<script type="text/javascript">
swfobject.embedSWF("http://invincible.dynalias.com:8080/HelloWorld.swf", "mycontent", "400", "420", "9.0.0","expressInstall.swf", {}, {allowScriptAccess:'always'},{id:'hw',name:'hw'});

function getFlash(movieName) {
   return ( navigator.appName.indexOf("Microsoft") != -1) ? window[movieName] : document.getElementById(movieName);
}
</script><p>
  <input type="text" id="exampleText" /> <input type="button" value="Set Text" onclick="getFlash('hw').setText(document.getElementById('exampleText')
.value)" />
</body>
</html>

et voici le code ActionScript ...

package {
  import flash.display.Sprite;
  import flash.text.TextField;
  import flash.external.ExternalInterface;
  import flash.system.Security;

  public class HelloWorld extends Sprite {

    private var textField:TextField = new TextField();
    public function HelloWorld() {
      Security.allowDomain("*");
      ExternalInterface.addCallback("setText", this.setText);
      textField.text = "Hello, world!";
      addChild(textField);
    }   
    public function setText(text:String):void {
      this.textField.text = text;
    }   
  }
}
Était-ce utile?

La solution

J'ai le même problème, déclencher et recevoir des événements d'écoute entre javascript et flash.

La solution consistait à utiliser le fichier AC_OETags.js fourni par Adobe script au lieu de flash JQuery. (Il se trouve dans le fichier zip sous Détection côté client, Adobe l’a probablement aussi à d’autres endroits.)

Problème lié à une situation de concurrence critique lorsque le flash crée les rappels javascript dans le navigateur. Cela n’est pas géré correctement par une intégration directe pour une raison quelconque.

<div>
<script>
// Major version of Flash required
var requiredMajorVersion = 10;
// Minor version of Flash required
var requiredMinorVersion = 0;

var hasRequestedVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision);
AC_FL_RunContent(
"src", "tagflash",
    "width", "200",
    "height", "200",
    "id", "myTagFlash",
    "quality", "high",
    "bgcolor", "#FFFFFF",
    "name", "myTagFlash",
    "allowScriptAccess","always",
    "type", "application/x-shockwave-flash",
    "pluginspage", "http://www.adobe.com/go/getflashplayer",
    "flashvars", "templateData=theYear:2010&theTagNumber:123"
);
</script>
</div>

Ensuite, vous pouvez faire: (fonctionne dans IE, FF, Safari, Crome, ++)

$("#tagFlash").gotoNewFrame();

Autres conseils

Je suis d'accord avec Robson sur le fait qu'il s'agit d'une situation de concurrence critique, mais ce n'est pas en "écriture de la balise Flash" et l'ajout d'un minuteur n'est pas une bonne solution - en fait, c'est très dangereux.

Le problème est que le fichier SWF n’est pas chargé et a pu initialiser votre interface externe. Pour un petit fichier SWF dans Chrome, le minutage peut être plus sensible que les autres ventilateurs, mais le problème sous-jacent n'est pas spécifique à Chrome.

Ce que vous devez faire est le suivant:

In Actionscript

Appelez cette fonction à partir de votre constructeur:

public function InitializeExternalInterface():void 
{   
      if (ExternalInterface.available) {

           // register actionscript functions so they can be called by JS   
           ExternalInterface.addCallback("activate", activate);
           Security.allowDomain("www.example.com");     

           // send message to parent page that SWF is loaded and interface active
           trace("External Interface Initialized...");
           ExternalInterface.call("flashInitialized")
      }
      else 
      {
          trace("ERROR: External Interface COULD NOT BE Initialized...");
      } 
}

Dans votre code HTML

 <script>

     function flashInitialized() 
     {
         alert("Initialized!");      // remove this obviously!
         $('#Main')[0].activate();   // safe to call Flash now
     }

 </script>

Vous pouvez trouver sur votre ordinateur local que cela fonctionne sans cela, mais dès que vous ajoutez des retards de réseau dans l'équation, vous regretterez de ne pas l'avoir fait. Un minuteur arbitraire est une mauvaise idée car vous obtiendrez toujours l'erreur sur une connexion lente. Cette méthode permet à la page d'appeler l'objet flash le plus tôt possible.

Remarque: L'utilisation du modèle "prêt à l'emploi" de jQuery N'EST PAS une solution au problème, même si au début, je l'ai confondu avec un.

$(function() 
{
   $('#animation')[0].SetTitle("Hello"); 
} 

De même, callbackFn de swfobject n'est pas non plus une solution qui indique simplement vous lorsque la balise est insérée et non pas lorsque le fichier SWF est chargé.

J'avais des problèmes avec ExternalInterface, Firefox et Chrome et j'ai découvert que le script Adobe n'écrivait pas la balise Flash assez rapidement. Par conséquent, lorsque le navigateur a tenté de trouver la fonction addCallback (), elle n'était pas là à l'époque.

Mettre simplement ma fonction Javascript qui appelle le flash créé, addCallback () dans un appel window.setTimeout () résout le problème. Les retards inférieurs à 200 ms provoquent toujours le problème.

Je n'ai pas & # 8217; pas besoin d'utiliser la solution qui consiste à essayer de trouver si la & # 8220; longueur & # 8221; Cet attribut existe dans l'objet document [FlashId]. Il suffit d'appeler & # 8220; FlashEmbed = document [FlashId] & # 8221; a bien fonctionné.

Après avoir beaucoup lutté, j'ai finalement décidé d'utiliser la solution officielle d'Adobe:

http: //help.adobe. com / fr_FR / FlashPlatform / reference / actionscript / 3 / flash / external / ExternalInterface.html

Recherchez ExternalInterfaceExample.as.

Il existe une solution de contournement au problème en désactivant le plug-in de flash intégré à Chrome:

  1. tapez les plugins chrome: // dans la barre d'adresse de chrome.
  2. développez les détails des plugins en cliquant sur les détails dans le coin supérieur droit.
  3. dans l'entrée de ". Adobe Flash Player " désactivant le premier.

Ceci n'est pas une solution, mais montre pourquoi cela se produit sur Chrome. Chrome s'accompagne de plugins flash intégrés, qui posent souvent des problèmes lorsque nous utilisons l'interface ExternalInterface de AS3, c'est agaçant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top