【问题标题】:Calling actionscript function from JS从 JS 调用 actionscript 函数
【发布时间】:2012-04-07 00:04:35
【问题描述】:

对于这个问题的任何帮助,我将不胜感激。

我试图在单击某个链接时执行 AS 功能,但我无法使其正常工作。我运行代码如下:

在我的对象构造函数中,我有以下行:

ExternalInterface.addCallback("methodName",methodName);

我的函数定义如下(在构造函数之外):

function methodName()
        {
//functioncode here
        }

在我的html文件中,javascript代码如下:

<script type="text/javascript">
function callExternalInterface() {
    thisMovie("swf").methodName();
}
function thisMovie(movieName) {
    if (navigator.appName.indexOf("Microsoft") != -1) {
        return window[movieName]
    }
    else {
        return document[movieName]
    }
}
    </script>

按钮调用上述函数的代码:

<input type="button" onclick="callExternalInterface()" value="Call ExternalInterface" />

flash 对象的嵌入方式如下:

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="655" height="324" align="middle" id="swf" name="swf">
    <param name="allowScriptAccess" value="always">
    <param name="allowFullScreen" value="false">
    <param name="movie" value="flash1.swf">
    <param name="menu" value="false">
    <param name="quality" value="best">
    <param name="bgcolor" value="#f3f3f3">  
    <embed src="flash1.swf" menu="false" quality="best" bgcolor="#f3f3f3" width="655" height="324" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer" id="swf" name="swf">
    </object>

根据 Firebug 控制台,当我单击按钮时,出现以下错误:

thisMovie("swf").methodName 不是函数

看起来这是一个无法识别该函数的 javascript 错误。我从该站点获得了大部分代码,我将不胜感激。谢谢!

【问题讨论】:

  • javascript 函数 callExternalInterface() 的代码在哪里?
  • 哎呀,抱歉,是错误的代码粘贴。在那里添加它。
  • 你试过不同的浏览器吗?
  • 当您在 Flash 初始化之前尝试调用函数时,有时会出现时间问题。但是,在这种特殊情况下似乎不太可能。在您按下按钮时,应该加载 Flash。 console.log(thisMovie("swf")) 说什么?
  • Pumbaa 我不完全确定,我如何获得该日志? (我原始帖子中的错误消息是从 Firebug 控制台发布的)

标签: javascript html flash actionscript


【解决方案1】:

在此处查看运行示例http://www.redcodelabs.com/2012/04/calling-actionscript-method-from-javascript/

这是帖子中的一些代码

package {
    import flash.display.Sprite;
    import flash.events.*;
    import flash.external.ExternalInterface;
    import flash.text.TextField;
    import flash.utils.Timer;
    import flash.text.TextFieldType;
    import flash.text.TextFieldAutoSize;

    public class ExternalInterfaceExample extends Sprite {
        private var input:TextField;
        private var output:TextField;
        private var sendBtn:Sprite;

        public function ExternalInterfaceExample() {
            input = new TextField();
            input.type = TextFieldType.INPUT;
            input.background = true;
            input.border = true;
            input.width = 350;
            input.height = 18;
            addChild(input);

            sendBtn = new Sprite();
            sendBtn.mouseEnabled = true;
            sendBtn.x = input.width + 10;
            sendBtn.graphics.beginFill(0xCCCCCC);
            sendBtn.graphics.drawRoundRect(0, 0, 80, 18, 10, 10);
            sendBtn.graphics.endFill();
            sendBtn.addEventListener(MouseEvent.CLICK, clickHandler);
            addChild(sendBtn);

            output = new TextField();
            output.y = 25;
            output.width = 450;
            output.height = 325;
            output.multiline = true;
            output.wordWrap = true;
            output.border = true;
            output.text = "Initializing...\n";
            addChild(output);

            if (ExternalInterface.available) {
                try {
                    output.appendText("Adding callback...\n");
                    ExternalInterface.addCallback("sendToActionScript", receivedFromJavaScript);
                    if (checkJavaScriptReady()) {
                        output.appendText("JavaScript is ready.\n");
                    } else {
                        output.appendText("JavaScript is not ready, creating timer.\n");
                        var readyTimer:Timer = new Timer(100, 0);
                        readyTimer.addEventListener(TimerEvent.TIMER, timerHandler);
                        readyTimer.start();
                    }
                } catch (error:SecurityError) {
                    output.appendText("A SecurityError occurred: " + error.message + "\n");
                } catch (error:Error) {
                    output.appendText("An Error occurred: " + error.message + "\n");
                }
            } else {
                output.appendText("External interface is not available for this container.");
            }
        }
        private function receivedFromJavaScript(value:String):void {
            output.appendText("JavaScript says: " + value + "\n");
        }
        private function checkJavaScriptReady():Boolean {
            var isReady:Boolean = ExternalInterface.call("isReady");
            return isReady;
        }
        private function timerHandler(event:TimerEvent):void {
            output.appendText("Checking JavaScript status...\n");
            var isReady:Boolean = checkJavaScriptReady();
            if (isReady) {
                output.appendText("JavaScript is ready.\n");
                Timer(event.target).stop();
            }
        }
        private function clickHandler(event:MouseEvent):void {
            if (ExternalInterface.available) {
                ExternalInterface.call("sendToJavaScript", input.text);
            }
        }
    }
}

和 html/JS

<html lang="en">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>ExternalInterfaceExample</title>
 <script language="JavaScript">
     var jsReady = false;
     function isReady() {
         return jsReady;
     }
     function pageInit() {
         jsReady = true;
         document.forms["form1"].output.value += "\n" + "JavaScript is ready.\n";
     }
     function thisMovie(movieName) {
         if (navigator.appName.indexOf("Microsoft") != -1) {
             return window[movieName];
         } else {
             return document[movieName];
         }
     }
     function sendToActionScript(value) {
         thisMovie("ExternalInterfaceExample").sendToActionScript(value);
     }
     function sendToJavaScript(value) {
         document.forms["form1"].output.value += "ActionScript says: " + value + "\n";
     }
 </script>
 </head>
 <body onload="pageInit();">

     <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
             id="ExternalInterfaceExample" width="500" height="375"
             codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">
         <param name="movie" value="ExternalInterfaceExample.swf" />
         <param name="quality" value="high" />
         <param name="bgcolor" value="#869ca7" />
         <param name="allowScriptAccess" value="sameDomain" />
         <embed src="ExternalInterfaceExample.swf" quality="high" bgcolor="#869ca7"
             width="500" height="375" name="ExternalInterfaceExample" align="middle"
             play="true" loop="false" quality="high" allowScriptAccess="sameDomain"
             type="application/x-shockwave-flash"
             pluginspage="http://www.macromedia.com/go/getflashplayer">
         </embed>
     </object>

     <form name="form1" onsubmit="return false;">
         <input type="text" name="input" value="" />
         <input type="button" value="Send" onclick="sendToActionScript(this.form.input.value);" /><br />
         <textarea cols="60" rows="20" name="output" readonly="true">Initializing...</textarea>
     </form>

 </body>
 </html>

【讨论】:

    【解决方案2】:

    您提供的问题描述不完整,无法得出您面临问题的任何结论。

    这是我创建的工作测试代码 - 使用您提供的部分代码 -

    HTML Header 标签中的 JavaScript 函数

    <script type="text/javascript">
          function callExternalInterface() {
             thisMovie("swf").methodName();
          }
    
          function thisMovie(movieName) {
            if(navigator.appName.indexOf("Microsoft") != -1) {
               return window[movieName]
            } else {
               return document[movieName]
            }
           }
    </script>
    

    Flash 对象以下列方式嵌入:

    <body bgcolor="#ffffff" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
            <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" id="swf" width="550" height="400" align="middle">
                <param name="allowScriptAccess" value="Always" />
                <param name="movie" value="AS3-JS.swf" />
                <param name="quality" value="high" />
                <param name="bgcolor" value="#ffffff" />
                <embed src="AS3-JS.swf" quality="high" bgcolor="#ffffff" width="550" height="400" swLiveConnect=true id="swf" name="swf" align="middle" allowScriptAccess="Always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
    

    和 AS 类文件

    package  {
    
    import flash.display.MovieClip;
    import flash.external.ExternalInterface;
    
    public class Main extends MovieClip {
    
    
        public function Main() 
        {
            // constructor code
            ExternalInterface.addCallback("methodName",methodName);
        }
    
        private function methodName():void
        {
            msg_txt.htmlText = "Called"
        }
    }
    

    }

    【讨论】:

    • 根本没有用......获取无法读取未定义的属性方法名称
    猜你喜欢
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2011-01-19
    • 2013-12-14
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多