2014-03-04 103 views
0

我知道有很多關於這個問題的文章和論壇帖子,很多都不起作用,仍然沒有答案。有些教程聲稱他們的代碼有效,但其中一些教程沒有下載頁面,其中一些教程下載頁面,鏈接不起作用。此外,也許有一種新的方式來做到這一點,我發現的代碼不再受支持。Javascript調用AS3函數

這裏是我的代碼:HTML和Javascript

<html> 
<head><title>Javascript to SWF</title> 
<script language="JavaScript"> 
function getFlashMovie(movieName) { 
    var isIE = navigator.appName.indexOf("Microsoft") != -1; 
    return (isIE) ? window[movieName] : document[movieName]; 
} 

function callToActionscript() 
{ 
    getFlashMovie("jscallswf").setMouseXY(); 
} 

callToActionscript(); 
</script> 
</head> 
<body style="background:red;"> 
<body> 
    <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0" width="450" id="jscallswf" align="middle" data="jscallswf.swf" style="height: 250"> 
     <param name="allowScriptAccess" value="sameDomain"> 
     <param name="allowFullScreen" value="false"> 
     <param name="movie" value="jscallswf.swf"> 
     <param name="quality" value="High"><param name="bgcolor" value="#ffffff"> 
     <embed src="jscallswf.swf" quality="High" bgcolor="#ffffff" width="400"  name="jscallswf" align="middle" allowscriptaccess="sameDomain" allowfullscreen="false"  type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer"  style="height: 250"> 
    </object> 
</body> 
</body> 
</html> 

AS3代碼:

import flash.external.ExternalInterface; 

ExternalInterface.addCallback("setMouseXY", rotateCam); 
function rotateCam() 
{ 
    td.text = "NEWTEXT"; 
} 

這裏是另一個JavaScript方法:

<html> 
<head><title>Javascript to SWF</title> 
<style type="text/css"> 
#jscallswf { 
margin:300px; 
} 
</style> 
<script type="text/javascript" src="http://code.jquery.com/jquery-1.11.0.min.js"> </script> 
<script type="text/javascript" src="swfobject.js"></script> 
<script language="JavaScript"> 
// JS Code 
// Embedding through SWFObject rocks in comparison with Adobe's garbage: 

var flashvars = {}; 

var params     = {}; 
params.menu     = "false"; 
params.salign    = "t"; 
params.scale    = "noscale"; 
params.wmode    = "transparent"; 
params.allowScriptAccess = "always"; 

var attributes    = {}; 
attributes.id = "jscallswf"; 

swfobject.embedSWF("jscallswf.swf", "flashDiv", "274", "246", "9.0.0", "", flashvars, params, attributes); 

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

function callFlashMethod() 
{ 
    thisMovie("jscallswf").setMouseXY(); 
} 


$(document).ready(function(){ 
    callFlashMethod(); 
}); 
</script> 
</head> 
<body style="background:red;"> 
<body> 
<div id="flashDiv" style="margin:200px;"></div> 
</body> 
</body> 
</html> 

兩個返回錯誤控制檯「遺漏的類型錯誤:不能調用未定義的方法'setMouseXY'「

+0

也許你太早打電話給他們測試? –

回答

2

請嘗試以下操作:

Main.as

package 
{ 
    import flash.display.Sprite; 
    import flash.display.StageAlign; 
    import flash.display.StageScaleMode; 
    import flash.events.Event; 
    import flash.external.ExternalInterface; 
    import flash.text.TextField; 

    /** 
    * <p>ExternalInterface example</p> 
    * <p><b>author:</b> Lukasz 'Severiaan' Grela</p> 
    * @author Lukasz 'Severiaan' Grela 
    */ 
    public class Main extends Sprite 
    { 
     protected var m_oOutput:TextField; 
     //--------------------------------------- 
     //Group: CONSTRUCTOR  
     public function Main():void 
     { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 
     } 



     protected function ei_invokeFunction(p_sMethod:String, ...args):void 
     { 
      //info("ei_invokeFunction(p_sMethod:String=" + p_sMethod + ", ...args=[" + args + "]):void"); 
      switch (p_sMethod) 
      { 
       case "func1": 
        func1.apply(this, args); 
        break; 
       case "func2": 
        func2.apply(this, args); 
        break; 
      } 
     } 

     protected function func1(num1:Number, num2:Number, num3:Number):void 
     { 
      m_oOutput.text = "func1(num1=" + num1 + ", num2=" + num2 + ", num3=" + num3 + ");"; 
     } 
     protected function func2(str1:String, num2:Number, str3:String):void 
     { 
      m_oOutput.text = "func2(str1=" + str1 + ", num2=" + num2 + ", str3=" + str3 + ");"; 
     } 


     protected function run():void 
     { 

      // entry point 
      m_oOutput = new TextField(); 
      m_oOutput.x = m_oOutput.y = 5; 
      m_oOutput.width = 480; 
      m_oOutput.height = 320; 
      m_oOutput.multiline = true; 
      m_oOutput.wordWrap = true; 
      m_oOutput.border = true; 

      addChild(m_oOutput); 

      //prepare the ExternalInterface hook-up 
      if (ExternalInterface.available) 
      { 
       try { 
        ExternalInterface.addCallback("invokeFunction", ei_invokeFunction); 
        m_oOutput.text = "ExternalInterface is available." 
       } 
       catch (err:*) 
       { 

        m_oOutput.text = "ExternalInterface is not available. \nError:" + err; 
       } 
      } 
      else 
      { 
       m_oOutput.text = "ExternalInterface is not available."; 
      } 
     } 

     private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 
      // 
      stage.align = StageAlign.TOP_LEFT; 
      stage.scaleMode = StageScaleMode.NO_SCALE; 
      stage.addEventListener(Event.RESIZE, onStageResized, false, 0, true); 

      run(); 
     } 
    } 
} 

的index.htm

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"/> 
    <title>external_interface_test</title> 
    <meta name="description" content="" /> 

    <script src="js/swfobject.js"></script> 
    <script> 
     var flashvars = { 
     }; 
     var params = { 
      menu: "false", 
      scale: "noScale", 
      allowFullscreen: "true", 
      allowScriptAccess: "always", 
      bgcolor: "", 
      wmode: "direct" // can cause issues with FP settings & webcam 
     }; 
     var attributes = { 
      id:"core" 
     }; 
     swfobject.embedSWF(
      "externalinterfacetest.swf", 
      "altContent", "490", "330", "10.0.0", 
      "expressInstall.swf", 
      flashvars, params, attributes); 
    </script> 
    <script> 
     var $DEBUG = true; 
     //daft implementation only for testing - this should be replaced (the body of that function) with more accurate/reliable version 
     function getFlashMovie(movieName) { 
      var isIE = navigator.appName.indexOf("Microsoft") != -1; 
      return (isIE) ? window[movieName] : document[movieName]; 
     } 

     /** 
     * Reference to the "core" SWF 
     */ 
     function getCore() 
     { 
      try 
      { 
       var movie = getFlashMovie("core"); 
      } 
      catch(e) 
      { 
       if($DEBUG) 
        alert("getCore" + "\n" + e); 
      } 
      return movie; 
     } 

     //The "invokeFunction" is the registered callback method within SWF in query 
     /** 
     * wrapper for calling flash function 
     */ 
     function function1(num1, num2, num3) 
     { 
      try 
      { 
       getCore().invokeFunction("func1", num1, num2, num3); 
      } 
      catch(e) 
      { 
       if($DEBUG) 
        alert("func1" + "\n" + e); 
      } 
     } 
     /** 
     * wrapper for calling flash function 
     */ 
     function function2(str1, num2, str3) 
     { 
      try 
      { 
       getCore().invokeFunction("func2", str1, num2, str3); 
      } 
      catch(e) 
      { 
       if($DEBUG) 
        alert("func2" + "\n" + e); 
      } 
     } 

    </script> 
    <style> 
     html, body { height:100%; overflow:hidden; } 
     body { margin:0; } 
    </style> 
</head> 
<body> 
    <div id="altContent"> 
     <h1>external_interface_test</h1> 
     <p><a href="http://www.adobe.com/go/getflashplayer">Get Adobe Flash player</a></p> 
    </div> 
    <div id="eiMenu"> 
     <a href='#' onclick='javascript:function1(1, 2, 3);return false;'>Function 1</a>| 
     <a href='#' onclick="javascript:function2('a', 2, 'c');return false;">Function 2</a> 

    </div> 
</body> 
</html> 

,這是screengrabs:

Initial state Function 1 clicked Function 2 clicked

你可以嘗試運行此,讓我知道你的輸出,我在FF27

+0

這是完美的,我遇到了錯誤,但這隻發生在本地安裝。錯誤是「錯誤:SecurityError:錯誤#2060」,我發現修復(添加本地URL到全局安全面板)在這篇文章http://stackoverflow.com/questions/2307335/security-error-when-trying-到呼叫ActionScript的功能從-JS。 – putoshop