JS和Flash(AS)相互调用

<!DOCTYPE html>
<html>
    <head>
        <title>swf</title>
        <meta charset="utf-8"/>
        <style type="text/css">
            html, body { height:100%; background-color: antiquewhite;}
            body { margin:0; padding:0; overflow:hidden; }
        </style>
    </head>
    <body>
        <div id="flashContent">
            <!--embed是给非IE用的,其中embed的name非常重要,必须与ID一致-->
            <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="550" height="400" id="swf">
                <param name="movie" value="swf.swf" />
                <param name="wmode" value="window" />
                <param name="allowScriptAccess" value="all" />
                <embed src="swf.swf" width="550" height="400"
                       name="swf" wmode="window" allowscriptaccess="all" type="application/x-shockwave-flash"
                       pluginspage="http://www.macromedia.com/go/getflashplayer">
            </object>
        </div>
        <div>
            <textarea id="txt" cols="30" rows="10"></textarea>
            <button id="btn">JS call AS</button>
        </div>
        <script type="text/javascript">
            var txt = document.getElementById("txt");
            var btn = document.getElementById("btn");
            var swf = window["swf"] || document["swf"];
            btn.onclick = function() {
                swf["JsCallAs"]("I‘m js."); //JsCallAs是flash里addCallback的函数
            }

            function AsCallJs(s){
                txt.value += s + "\n";
            }
        </script>
    </body>
</html>

以上是html代码,以下是AS代码

import flash.events.MouseEvent;

ExternalInterface.addCallback("JsCallAs", onJsCallAsHandler);
function onJsCallAsHandler(s:String):void {
    tf.appendText("as收到:" + s + "\n");
}

btn.addEventListener(MouseEvent.CLICK, onAsCallJsHandler);
function onAsCallJsHandler(e:MouseEvent):void {
    ExternalInterface.call("AsCallJs", "hi! I‘m as.");
}

大家都知道,最常用的嵌套flash的方法是OE(object-embed)方式,除此之外还有一些嵌入方式,可以参考kissyui里的文章 http://docs.kissyui.com/1.4/docs/html/tutorials/kissy/swf/embed-swf-onto-webpage.html

本例只考虑OE方式,其他嵌入类型大家自行测试,本文不过多讨论。

本例子在IE6-8及现代浏览器中测试通过 例子使用最标准的OE方式嵌套flash,原理是IE获取object,非IE获取embed,

html中的关键点在于embed的name必须与object的ID一致,否则chrome下调用不到embed,就会出现swf为空,所以浏览器会报出没有JsCallAs方法的错误:

html中关于flash标签的其他属性: wmode在此不会影响调用 在此写上 是为了方便大家复制代码,毕竟这个属性很常用

allowScriptAccess 不为never即可 不写此属性也可以 否则flash无法与js通讯

as中代码比较单纯,不需要太多技巧,参考AS3的API即可,主要是ExternalInterface的call和addCallback方法。


在线演示地址: http://gotoandlearn.net/asjs

时间: 2024-10-28 14:24:33

JS和Flash(AS)相互调用的相关文章

JS前后台方法的相互调用

一.前台调用后台的方法: 1.在后台编写你要调用到前台的方法,如下://javaScript函数中执行C#代码中的函数public string str() { return "javaScript方法中执行C#代码中的方法"; } 2.前台用JS就可以实现调用后台的方法,如下:<script type="text/javascript"> function Test() { var a = "<%=str()%>"; /

JS和ASP后台相互调用问题

项目开发时,我们有时候会遇到后台asp调用前台的JS函数,又或者前台JS需要调用后台aspx.cs的函数,这里记录下如何处理这些问题 1.  ASP后台代码中,如果需要运行JS函数,则使用RegisterStartupScript函数,如下 Page.ClientScript.RegisterStartupScript(Page.GetType(), "", "<script>window.open('default2.aspx')</script>&

通过webbrowser实现js与winform的相互调用

1客户端页面 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head>     <meta charset="utf-8" />     <title></title> </head> <body>     <script>         function test(message)

Js和原生相互调用总结

一.前言 现在市面上有一些app是通过原生ios.Android加载一个网页实现的,如图所示,这样的app我们称之为 Hybrid App                              那么为什么要用 hybrid app呢? 个人认为的原因有两点:1.提高开发效率,以钉钉为例在涉及到一些OA操作比如打卡,请假等功能的时候,显然一个嵌入一个网页就能够满足需求,如果在让IOS和Android再去各自开发一套那么效率就很低了.2.提高迭代效率.以商城为例,商城页面会根据市场情况实时发生变

ASP.NET的后台代码和前台JS代码相互调用

在实际的Web开发中,我们可能会常常遇到后台调用前台JS代码或者前台JS调用后台代码的情况.今天就把比较实用的前后台相互调用的方法总结出来和大家分享. <1>后台代码调用前台JS代码 一.说到后台代码调用前台的JS代码很多人首先就会想到使用 ClientScript.RegisterStartupScript()方法,该方法主要是注册启动脚本文本,即在后台执行调用前台JS代码 该方法有两个重载, 1.ClientScript.RegisterStartupScript(Type type,st

转载 iOS js oc相互调用(JavaScriptCore)

iOS js oc相互调用(JavaScriptCore) 从iOS7开始 苹果公布了JavaScriptCore.framework 它使得JS与OC的交互更加方便了. 下面我们就简单了解一下这个框架 首先我导入framework 方法如下 点击Linked Frameworks and Libraries 的添加后 选择 JavaScriptCore.framework 选中JavaScriptCore.framework后 点击右下角Add 添加完成 好 创建完成之后我们导入一下头文件 [

WebView中Js与Android本地函数的相互调用

介绍 随着Html5的普及,html在表现力上不一定比原生应用差,并且有很强的扩展兼容性,所以越来越多的应用是采用Html与Android原生混合开发模式实现. 既然要实现混合开发,那么Js与Android原生函数的相互调用就必不可少了.这里写了一个demo,实现点击html中的图片进行本地展示. 原理 1.Android调用js很简单,直接webView.loadUrl("javascript:JS中的方法名称()");即可. 2.js调用Android方法,需要使用WebView.

iOS JS 和 OC交互 / JS 和 native 相互调用

现在app 上越来越多需求是通过UIWebView 来展示html 或者 html5的内容, js 和 native OC代码交互 就非常常见了. js 调用 native  OC代码 第一种机制 (1)最常用的是 利用 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationT

关于action script与js相互调用的Security Error问题

大家都知道,as和js相互调用可以通过ExternalInterface.call和ExternalInterface.addCallback来进行. 比较好的做法是使用之前通过ExternalInterface.available来检测一下是否可用. 然而被坑了的是,这个ExternalInterface.available并不检测安全限制,也就是即使ExternalInterface.available=true,还是可能报错. 为了防止报错阻断程序正常运行,还需要再包一层try catch