How to call flash actionscript callback method from javascript?

25,024

Solution 1

Here's something that should work really good:

  1. Use SWFObject.js for embedding the Flash content:

    // Embedding through SWFObject rocks in comparison with Adobe shits:
    var flashvars = {};
    
    var params                  =   {};
    params.menu                 =   "false";
    params.salign               =   "t";
    params.scale                =   "noscale";
    params.wmode                =   "transparent";
    params.allowScriptAccess    =   "always";
    
    var attributes              =   {};
    attributes.id = "${swf}";
    
    swfobject.embedSWF("${swf}.swf", "flashDiv", "${width}", "${height}", "9.0.0", "", flashvars, params, attributes);
    
  2. Use this for the HTML:

    <body>
        <div id="flashDiv"></div>
    </body>
    
  3. To call your Flash method use this pattern:

    // Functions needed for calling Flex ExternalInterface
    function thisMovie(movieName) 
    {
        if (navigator.appName.indexOf("Microsoft") != -1) 
        {
            return window[movieName];
        } 
        else 
        {
            return document[movieName];
        }
    }
    
  4. Call the Flash method:

    function callFlashMethod()
    {
        thisMovie("${swf}").js_method_to_call();
    }
    

Solution 2

You get a reference to your embedded SWF object and use it to make a call to your as3 method.

//AS3 Code
ExternalInterface.addCallback("helloFromJS",helloFromJS);

private function helloFromJS():void
{
    trace("JS is saying hello");
}


//HTML Code
<object width="100%" height="100%" id="Test">
          <param name="movie" value="Test.swf"/>

//JS Code
var swfObject = document.getElementById("Test");
swfObject.helloFromJS();

Solution 3

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/external/ExternalInterface.html?filter_flash=cs5&filter_flashplayer=10.2&filter_air=2.6

This page describe the solution very well, just try to make that sample work. So you can sort out the problem, and Vladimir Tsvetkov's answer is complete.

Solution 4

There is an interesting and quite detailed tutorial here http://bytes.com/topic/flash/answers/694359-how-do-i-access-flash-function-using-javascript#post2759970

Share:
25,024
Tricks By Sam
Author by

Tricks By Sam

I deliver faster loading mobile-friendly websites and promote them with my digital marketing skill. Most of my website loading time is within 3 seconds and they maintain the Progressive Web App standard. If you need any consultancy please email me at [email protected]

Updated on May 24, 2020

Comments

  • Tricks By Sam
    Tricks By Sam almost 4 years

    I tried to call a flash callback method from JavaScript. But it seems not working. The flash action script example code is like below [Simplified]:

    import flash.events.ActivityEvent; 
    import flash.events.StatusEvent; 
    import flash.external.ExternalInterface;
    
    var test_var = ExternalInterface.addCallback("js_method_to_call", flash_method);
    
    
    function flash_method()
    {   
      return "test"; 
    }
    

    The javascript example code is written below [Simplified]:

     function callFlashMethod(){
       var flashFile = eval("window.document.test");
       flashFile.js_method_to_call;
     }
     function loadTest(){
       swfobject.embedSWF("test.swf", "test", "1", "1", "10.0.0", false);
     }
    
     $(document).ready(function(){
       loadTest();
       callFlashMethod();
     });
    

    It is always display the error in fire bug console "flashFile.js_method_to_call is not a function".

  • Tricks By Sam
    Tricks By Sam over 12 years
    I have tried all 3 options below but seems not working. document.getElementById("test"), $("#test"), eval("window.document.test")
  • Tricks By Sam
    Tricks By Sam over 12 years
    I am getting the error in firebug console thisMovie("test").js_method_to_call is not a function
  • Vladimir Tsvetkov
    Vladimir Tsvetkov over 12 years
    Are you using the JS from my sample for loading the SWF? Make sure that attributes.id = "test"; The placeholder variable ${swf} will work only if you build with the Flash Builder and if this code is placed inside the index.template.html and you have annotated appropriately the entry point Sprite of your app.