Как вызвать метод обратного вызова Flash Actionscript из JavaScript? - PullRequest
5 голосов
/ 05 октября 2011

Я пытался вызвать метод мгновенного обратного вызова из JavaScript.Но, похоже, не работает.Пример кода сценария флэш-действия приведен ниже [Упрощено]:

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"; 
}

Пример кода JavaScript написан ниже [Упрощено]:

 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();
 });

Всегда отображается ошибка при пожаребаг консоли "flashFile.js_method_to_call не является функцией".

Ответы [ 5 ]

14 голосов
/ 05 октября 2011

Вот кое-что, что должно работать очень хорошо:

  1. Используйте SWFObject.js для встраивания содержимого Flash:

    // 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. Используйте это для HTML:

    <body>
        <div id="flashDiv"></div>
    </body>
    
  3. Чтобы вызвать метод Flash, используйте этот шаблон:

    // Functions needed for calling Flex ExternalInterface
    function thisMovie(movieName) 
    {
        if (navigator.appName.indexOf("Microsoft") != -1) 
        {
            return window[movieName];
        } 
        else 
        {
            return document[movieName];
        }
    }
    
  4. Вызовите метод Flash:

    function callFlashMethod()
    {
        thisMovie("${swf}").js_method_to_call();
    }
    
8 голосов
/ 05 октября 2011

Вы получаете ссылку на встроенный SWF-объект и используете его для вызова метода as3.

//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();
1 голос
/ 06 октября 2011

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

На этой странице очень хорошо описывается решение, просто попробуйте заставить этот пример работать.Таким образом, вы можете разобраться в проблеме, и ответ Владимира Цветкова завершен.

1 голос
/ 06 октября 2011

Здесь есть интересное и довольно подробное руководство http://bytes.com/topic/flash/answers/694359-how-do-i-access-flash-function-using-javascript#post2759970

0 голосов
/ 05 октября 2011

Я не уверен насчет этой строки:

var flashFile = eval("window.document.test");

Я бы использовал:

var flashFile = document.getElementById("test");

Кроме того, я предполагаю, что это была просто опечатка при вставке здесь, но flashFile.js_method_to_call; должно быть flashFile.js_method_to_call();

...