0

Hé, j'ai donc beaucoup de mal à faire fonctionner ExternalInterface, ce qui est bizarre, parce que je l'utilise assez souvent.ExternalInterface

J'espère que cela est quelque chose que je viens de manquer parce que je l'ai regardé trop longtemps.

La fonction flash_ready retourne correctement ObjectId, et pour autant que je peux dire, tout le reste est dans l'ordre.

Malheureusement, lorsque je l'exécute, j'obtiens une erreur (variant selon le navigateur) me disant que, fondamentalement, document.getElementById (<movename>) .test() n'est pas une méthode valide.

Voici le code:

javascript:

function flash_ready(i){ 
    document.getElementById(i).test('success!'); 
} 

Intégrer Html (généré):

<script type="text/javascript"> 
    swfobject.embedSWF("/chainmaille/includes/media/flash/upload_image.swf", "/chainmaille/includes/media/flash/upload_image", "500", "50", "9.0.0","expressInstall.swf", {}, {allowScriptAccess:'always', wmode:'transparent'},{id:'uploader_flash',name:'uploader_flash'}); 
</script> 
<object type="application/x-shockwave-flash" id="uploader_flash" name="uploader_flash" data="/chainmaille/includes/media/flash/upload_image.swf" width="500" height="50"><param name="allowScriptAccess" value="always"><param name="wmode" value="transparent"></object> 

AS3:

package com.jesseditson.uploader { 

    import flash.display.MovieClip; 
    import flash.external.ExternalInterface; 
    import flash.system.Security; 

    public class UI extends MovieClip { 

    // Initialization: 
    public function UI() { 
     Security.allowDomain('*'); 
     ExternalInterface.addCallback("test", test); 

     var jscommand:String = "flash_ready('"+ExternalInterface.objectID+"');"; 
     var url:URLRequest = new URLRequest("javascript:" + jscommand + " void(0);"); 
     navigateToURL(url, "_self"); 
    } 

    public function test(t){ 
     trace(t); 
    } 
    } 
} 

SWFObject est inclus via le code Google , et Le flash embarque très bien, donc ce n'est pas le problème.

J'ai une configuration très similaire travaillant sur un autre serveur, mais ne peut pas sembler le faire fonctionner sur celui-ci. C'est un serveur partagé Hostgator. Serait-ce la faute du serveur? Quelqu'un voit-il des problèmes de syntaxe évidents?

Merci d'avance!

+0

ne pouvait-il que dans le temps d'appeler 'test (t)' il n'est pas défini? –

+0

Eh bien, test (t) ne sera pas appelé tant que le flash n'est pas chargé, car la fonction flash_ready() est appelée depuis le flash lui-même. Je ne sais pas si cela a du sens, mais voici le flux: UI instancié -> constructeur (UI) -> flash_ready() appelé -> test() appelé Donc, flash appelle la fonction de test via javascript, donc test doit être défini. Ouais? – Jesse

+0

Est-ce qu'il le fait dans tous les navigateurs? J'ai parfois des problèmes avec IE que je dois aplanir. –

Répondre

1

Ok, donc après une enquête plus approfondie, il semble qu'il y avait un problème avec plusieurs instances de l'objet flash, parce que je le clonage à une visionneuse. Je l'ai fait fonctionner maintenant.

0

Est-flash_ready recevoir ObjectId que vous attendez?

Aussi, pourquoi utiliser:

var jscommand:String = "flash_ready('"+ExternalInterface.objectID+"');"; 
var url:URLRequest = new URLRequest("javascript:" + jscommand + " void(0);"); 
navigateToURL(url, "_self"); 

Lorsque cela est conçu pour le faire:

ExternalInterface.call("flash_ready", ExternalInterface.objectID); 
+0

flash_ready reçoit l'objet attendu, quant à l'utilisation de la méthode d'appel, je viens d'ajouter qu'en raison de mon succès précédent, ce code est définitivement Non terminé, je redirige les appels vers ExternalInterface dès que je résous ce problème. Merci! – Jesse

0

Poster votre source (pré-generatred). Lorsque votre navigateur dit [Flash] .Method n'est pas une fonction, 99% du temps cela signifie que vous avez essayé d'appeler une fonction dans Flash avant que le fichier .swf ne soit prêt. Je vois que vous avez essayé de le faire, mais de toute évidence, cela ne fonctionne pas, il faut donc que quelque chose disparaisse. Alors postez votre source pré-rendue et je suis sûr que nous pouvons trouver le problème.

1

La construction du Flash n'est pas encore terminée. Vous appelez votre callback flash_ready depuis le constructeur, et le JS essaie donc d'appeler avant que l'objet ne soit sur la scène. Déplacez votre appel flash_ready vers, disons, un écouteur Event.ADDED_TO_STAGE et il devrait commencer à fonctionner.

1

Je viens de passer 5 heures à combattre avec ça. C'était vraiment très frustrant. Dans mon cas, la solution était très très simple et je ne l'aurais jamais deviné. donc d'abord pour tous ceux qui ont jamais vu le débogueur de flash player en cours d'exécution sur les fichiers dans votre navigateur trouver this link that walks you through the setup a donné lieu à une expérience un peu magique :) maintenant à ma découverte ExternalInterface: Il y avait une violation de bac à sable dans le même domaine.Cela signifie que Flash ne peut pas accéder à www.votredomaine.com depuis votredomaine.com. Ce qui est bizarre, c'est que vous n'appelez pas explicitement le domaine avec ExternalInterface. Quoi qu'il en soit, la solution était très simple: ajoutez ceci à mon fichier .htaccess et c'est tout!

# Redirect non-www to www 
RewriteCond %{HTTP_HOST} !^www\. 
RewriteRule (.*) http://www.youtdomain.com/$1 [R=301,L] 

Hope this helps quelqu'un