2011-06-01 98 views
6

我試圖在使用ExternalInterface.addCallback API的動作腳本中調用一個函數,但我似乎無法讓它工作。下面是我有:通過Javascript訪問ActionScript函數

的ActionScript:

//MyClass.as 
package { 

    import flash.display.Sprite; 
    import flash.external.ExternalInterface; 

    public class MyClass extends Sprite 
    { 
     public function MyClass() 
     { 
      ExternalInterface.addCallback('getStringJS', getStringAS); 
     } 

     public function getStringAS():String 
     { 
      return "Hello World!"; 
     } 
    } 
} 

注:我使用的是柔性mxmlc編譯如果該事項編譯爲swf這一點。

HTML/JavaScript的:

<!doctype html> 
<html> 
    <head> 
     <title>User Identification</title> 
    <head> 
    <body> 
     <object id="MyClass" name="MyClass" type="application/x-shockwave-flash" data="MyClass.swf" width="1" height="1"> 
      <param name="movie" value="MyClass.swf"> 
      <embed src="MyClass.swf" width="1" height="1"> 
     </object> 
     <script type="text/javascript"> 
      var flash = document.getElementById("MyClass"); 
      var str = flash.getStringJS(); 
      alert(str); 
     </script> 
    </body> 
</html> 

我得到的錯誤是:

Uncaught TypeError: Object #<HTMLObjectElement> has no method 'getStringJS' 

我也嘗試添加在情況下SWF文件是不加載超時,但我這種方法也沒有任何成功。

有什麼想法?

乾杯,
邁克

回答

5

我想通了。通過ExternalInterface.call發信號通知javascipt的關鍵方法,因此我們確信swf已加載。最「通用」的方式來做到這一點如下:

MyClass.as

//MyClass.as 
package { 

    import flash.display.Sprite; 
    import flash.external.ExternalInterface; 

    public class MyClass extends Sprite 
    { 
     public function MyClass() 
     { 
      ExternalInterface.addCallback('getStringJS', getStringAS); 
      if (ExternalInterface.available) { 
       ExternalInterface.call("isConnectedFlex"); 
      } 
     } 

     public function getStringAS():String 
     { 
      return "Hello World!"; 
     } 
    } 
} 

的index.html

<!doctype html> 
<html> 
    <head> 
     <title>User Identification</title> 
    <head> 
    <body> 
     <object id="MyClass" name="MyClass" type="application/x-shockwave-flash" data="MyClass.swf" width="1" height="1"> 
      <param name="movie" value="MyClass.swf"> 
      <embed src="MyClass.swf" width="1" height="1"> 
     </object> 
     <script type="text/javascript"> 

      var flash = document.getElementById("MyClass"); 

      function isConnectedFlex() { 
       var str = flash.getStringJS(); 
       alert(str); 
      } 


     </script> 
    </body> 
</html> 
+0

不錯的例子。作品仍在2017年。對於其他人,還可以在此處找到其他一些其他信息:http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7cb1.html – Aleks 2017-02-09 13:40:57

2

我認爲這個問題是沒有被加載閃存的問題。我嘗試使用window.onload事件代碼和它的工作對我來說:

閃光燈一樣的...

HTML/JS:

<!doctype html> 
<html> 
    <head> 
     <title>User Identification</title> 
    <head> 
    <body> 

     <object id="MyClass" name="MyClass" type="application/x-shockwave-flash" data="MyClass.swf" width="1" height="1"> 
      <param name="movie" value="MyClass.swf"> 
      <embed src="MyClass.swf" width="1" height="1"> 
     </object> 

     <script> 

      window.onload = function() { 

       var flash = document.getElementById("MyClass"); 
       var test = flash.getStringJS("test"); 
       alert(test); //pops up with "Hello World!" on Firefox 

      }; 

     </script> 
    </body> 
</html> 

這是否幫助?

+0

是啊,這讓我意識到我真的需要學習來檢查我的在其他瀏覽器工作哈哈。它適用於Firefox和IE,但不適用於Chrome。無論哪種方式,我仍然需要一個更普遍接受的方法。有什麼想法嗎? – Swift 2011-06-01 23:15:31

+0

我明白了。你可能想看看這個鏈接:[問題訪問外部接口暴露的方法在谷歌瀏覽器](http://stackoverflow.com/questions/1436722/problem-accessing-externalinterface-exposed-method-in -google-chrome) – Ian 2011-06-01 23:24:00