调用flex-AS函数时出现Javascript错误

| 我正在尝试从JS调用调用操作脚本函数,但出现以下错误
   Error: getFlashMovie(swfobjectID).sayWhat is not a function
任何人都可以让我知道我在做什么错
     <html>

     <OBJECT classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" id=\"myMovieName\" WIDTH=\"225\" HEIGHT=\"200\">
     <PARAM NAME=\"movie\" VALUE=\"ax.swf\" /> <PARAM NAME=\"quality\" VALUE=\"high\" /> <PARAM NAME=\"bgcolor\" VALUE=\"#FFFFFF\" /> <EMBED href=\"ax.swf\" src=\"ax.swf\" quality=high bgcolor=#FFFFFF NAME=\"myMovieName\" ALIGN=\"\" TYPE=\"application/x-shockwave-flash\"> </EMBED> </OBJECT>



     <script>
     function getFlashMovie(movieName) {
        alert(\"In get Flash Movie\");
         document.getElementById(movieName).setAttribute(\"name\", movieName);
         var isIE = navigator.appName.indexOf(\"Microsoft\") != -1;
         return (isIE) ? window[movieName] : document[movieName];
     }

     function sayWhat()
     {
        alert(\"In call as\");
        var swfobjectID = \'myMovieName\';  
        alert(swfobjectID);
        //call flex function 
        getFlashMovie(swfobjectID).sayWhat();
     }
     </script>
     <input type=\"button\" onclick=\"javascript:sayWhat();\" value=\"Click Me\" />

     </html>
MXML
  <?xml version=\"1.0\" encoding=\"utf-8\"?>
  <mx:Application xmlns:mx=\"http://www.adobe.com/2006/mxml\" layout=\"absolute\" creationComplete=\"initCamera()\">

  <mx:Script>
  <![CDATA[

  import mx.controls.Button;
  import mx.controls.Alert;
  import flash.display.InteractiveObject;
  import flash.display.Sprite;
  import flash.media.*;
  import flash.net.*;
  import flash.external.*;
  import flash.external.ExternalInterface;



  public function sayWhat():void {
  Alert.show(\"Hi\");
  }

  public function initCamera():void {
  //stop();
  ExternalInterface.addCallback(\"sayWhat\", sayWhat);

  }        


   ]]>               
  </mx:Script>
  </mx:Application>
    
已邀请:
这是一个工作示例应用程序,可从JavaScript调用flex sayWhat funciton。 它包含4个文件:
ax.mxml
call_flfunc.html
ax.js
ax.css
。 您应该将最后三个文件和生成的ax.swf文件放在Web服务器上的同一文件夹中(或修改其引用路径),然后它将起作用。 ax.mxml:您的主要flex应用程序的结构
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<mx:Application xmlns:mx=\"http://www.adobe.com/2006/mxml\" layout=\"absolute\" 
    width=\"300\" height=\"300\" backgroundColor=\"#bee3f6\"
    creationComplete=\"onCreationComplete()\">
    <mx:Script>
        <![CDATA[

            import mx.controls.Alert;

            public function sayWhat():void {
                Alert.show(\"Hi\");
            }

            public function onCreationComplete():void {
                Security.allowDomain(\"localhost\");

                // binds this.sayWhat to the external interface, so when from   
                // javascript is called the compiled swf object\'s sayWhat function,
                // it will be transferred to this.sayWhat. 
                ExternalInterface.addCallback(\"sayWhat\", sayWhat);

                // The next line tells the external interface (the parent application:
                // browser window), that this application has finished loading, its 
                // ready to be used.
                // In js there has to be a global method with this name.
                ExternalInterface.call(\"onFlashAppInited\");
            }        

        ]]>             
    </mx:Script>
</mx:Application>
call_flfunc.html:ax.swf嵌入到的html内容
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" 
    \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">
    <head>
        <title>AX</title>
        <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />
        <link href=\"ax.css\" rel=\"stylesheet\" type=\"text/css\" />
    </head>
    <body>
        <div id=\"app\">
            <div id=\"app-header\">
                <input type=\"button\" value=\"Call Flex function\"
                    onclick=\"onButtonClick()\" />
            </div>
        </div>
        <!-- tmp is a not displayed div element used just to hold the swf 
            until it gets rendered inside the app div -->
        <div id=\"tmp\">
            <object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" id=\"ax\"
                width=\"300\" height=\"300\"
                codebase=\"http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab\">
                <param name=\"movie\" value=\"ax.swf\" />
                <param name=\"quality\" value=\"high\" />
                <param name=\"bgcolor\" value=\"#bee3f6\" />
                <param name=\"allowScriptAccess\" value=\"always\" />
                <embed src=\"ax.swf\" quality=\"high\" bgcolor=\"#bee3f6\" width=\"300\"
                    height=\"300\" name=\"ax\" align=\"middle\" play=\"true\" loop=\"false\"
                    quality=\"high\" allowScriptAccess=\"always\"
                    type=\"application/x-shockwave-flash\"
                    pluginspage=\"http://www.adobe.com/go/getflashplayer\"> </embed>
            </object>
        </div>
        <script type=\"text/javascript\" src=\"ax.js\"></script>
    </body>
</html>
ax.js:包含所有必需的javascript类和函数
function Util(){
    this.ua = navigator.userAgent.toLowerCase();
    this.isOpera = this.ua.indexOf(\"opera\") > -1;
    this.isSafari = (/webkit|khtml/).test(this.ua);
    this.isIE = !this.isOpera && this.ua.indexOf(\"msie\") > -1;
    this.isIE7 = !this.isOpera && this.ua.indexOf(\"msie 7\") > -1;
    this.isGecko = !this.isSafari && this.ua.indexOf(\"gecko\") > -1;
    this.ieVersion = parseInt(this.ua.substring(this.ua.indexOf(\"msie\") + 4));
    if (this.ieVersion == 0) {
        this.ieVersion = 100;
    }
}
Util.prototype = {};
var util = new Util();

/**
 * 
 * @param id
 * @param swf
 * @param width
 * @param height
 * @param scriptAccess
 * @param allowFullscreen
 * @return
 */
function FO(id, swf, width, height, scriptAccess, allowFullscreen){
    this.id = id;
    this.movie = swf;
    this.height = height ? height : 180;
    this.width = width ? width : 240;
    this.scriptAccess = scriptAccess ? scriptAccess : \"always\";
    this.allowFullscr = allowFullscreen ? \"true\" : \"false\";
    this.obj = document.createElement(\"embed\");
    this.obj.src = this.movie;
    this.obj.width = this.width;
    this.obj.height = this.height;
    this.obj.name = this.id;
    this.obj.id = this.id;
    this.obj.align = \"middle\";
    this.obj.type = \"application/x-shockwave-flash\";
    this.obj.setAttribute(\"quality\", \"high\");
    this.obj.setAttribute(\"bgColor\", \"#bee3f6\");
    this.obj.setAttribute(\"play\", \"true\");
    this.obj.setAttribute(\"loop\", \"false\");
    this.obj.setAttribute(\"allowScriptAccess\", this.scriptAccess);
    this.obj.setAttribute(\"allowFullscreen\", this.allowFullscr);
    this.obj.setAttribute(\"pluginspage\", \"http://www.adobe.com/go/getflashplayer\");
}
FO.prototype = {
    id :null,
    width :null,
    height :null,
    movie :null,
    scriptAccess :null,
    allowFullscr :null,
    obj :null,

    addParam : function(name, value){
        var p = document.createElement(\"param\");
        p.name = name;
        p.value = value;
        this.obj.appendChild(p);
    }
};
var app = document.getElementById(\"app\");
var appInited = false;

function onButtonClick(){
    if (appInited)
        flashApp.sayWhat();
    else
        alert(\"Flash app not inited!\");
}

function init(){
    if (util.isIE)
        flashApp = document.getElementById(\"ax\");
    else 
        flashApp = new FO(\"ax\", \"ax.swf\", 300, 300).obj;
    app.appendChild(flashApp);
}

function onFlashAppInited() {
    // alert(\"Flash app inited!\");
    appInited = true;
    // remove the temporary swf container: tmp
    document.body.removeChild(document.getElementById(\"tmp\"));
}
window.onload = init;
ax.css:应用于“ 5”页面的样式表
html, body {
    width: 100% !important;
    height: 100%;
    padding: 0px;
    margin: 0px;
    overflow: hidden;
    text-align: center;
}
body {
    overflow: auto;
    text-align: center;
}
object, embed {
    margin: 0px !important;
    padding: 0px !important;
}
#app {
    margin-left: auto;
    margin-right: auto;
    margin-top: 2%;
    width: 1000px;
    height: 545px;
    text-align: center;
}
#app-header {
    margin-left: auto;
    margin-right: auto;
    width: 1000px !important;
    text-align: center;
    height: 23px;
    line-height: 23px;
    overflow: hidden;
    white-space: nowrap;
    text-align: center;
}
#tmp {
    display: none;
    visible: false;
}
我希望它是可以理解的,并且您可以从中工作。     
您可能需要js中的其他解决方法,才能从任何浏览器调用flash函数。 在这里,我分享了实现此目标的方式(希望它尚未被弃用...)。您需要一个javascript类(我将其命名为FO):
/**
 * 
 * @param id
 * @param swf
 * @param width
 * @param height
 * @param scriptAccess
 * @param allowFullscreen
 * @return
 */
function FO(id, swf, width, height, scriptAccess, allowFullscreen){
    this.id = id;
    this.movie = swf;
    this.height = height ? height : 180;
    this.width = width ? width : 240;
    this.scriptAccess = scriptAccess ? scriptAccess : \"always\";
    this.allowFullscr = allowFullscreen ? \"true\" : \"false\";
    this.obj = document.createElement(\"embed\");
    this.obj.src = this.movie;
    this.obj.width = this.width;
    this.obj.height = this.height;
    this.obj.name = this.id;
    this.obj.id = this.id;
    this.obj.align = \"middle\";
    this.obj.type = \"application/x-shockwave-flash\";
    this.obj.setAttribute(\"quality\", \"high\");
    this.obj.setAttribute(\"bgColor\", \"#bee3f6\");
    this.obj.setAttribute(\"play\", \"true\");
    this.obj.setAttribute(\"loop\", \"false\");
    this.obj.setAttribute(\"allowScriptAccess\", this.scriptAccess);
    this.obj.setAttribute(\"allowFullscreen\", this.allowFullscr);
    this.obj.setAttribute(\"pluginspage\", \"http://www.adobe.com/go/getflashplayer\");
}
FO.prototype = {
    id :null,
    width :null,
    height :null,
    movie :null,
    scriptAccess :null,
    allowFullscr :null,
    obj :null,

    addParam : function(name, value){
        var p = document.createElement(\"param\");
        p.name = name;
        p.value = value;
        this.obj.appendChild(p);
    }
};
您将需要一种初始化方法(或扩展现有方法):
// should be called on window.onload
function init() {
    var flashObject = null;
    if (isIE)
        flashObject = document.getElementById(\"myMovieName\");
    else 
    {
        flashObject = new FO(\"myMovieName\", \"ax.swf\", 225, 200).obj;
        // **app** is the id of a div / html container element, 
        // in which your <object> is positioned. 
        document.getElementById(\"app\").appendChild(flashObject);
    }
}
window.onload = init;
并用于调用所需的方法:
//somewhere else in your code:
if (flashObject)
    flashObject.sayWhat();
    
从javascript调用时,请尝试:
myMovieName.sayWhat();
    

要回复问题请先登录注册