Javascript调用flex-AS函数时出错

Javascript error on calling flex-AS function

本文关键字:出错 函数 flex-AS 调用 Javascript      更新时间:2023-09-26

我试图从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函数的工作示例应用程序。

包含ax.mxmlcall_flfunc.htmlax.jsax.css 4个文件。
你应该把最后三个文件和生成的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:应用于call_flfunc.html页面的样式表

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