在Javascript中监听flash事件(转)
在Javascript中监听flash事件,其实有两种做法:
1、在特定的环境下(例如专门制作的flash),大家约定一个全局函数,然后在flash的事件中用ExternalInterface.call调用这个全局函数即可。
2、在非特定的环境下(例如编写通用的flash插件),是不能限制用户的函数名的,所以根本无法约定全局函数;是否可以通过类似js的回调函数的形式实现事件监听呢?
其实js与flash的通信,一般情况下可以进行一些比较简单的通信,如传递基本的数据类型、传递简单的对象、调用函数等,可是Function(即函数,回调函数肯定都是Function类的实例)不在基本的数据类型中,它是无法被传递的。
虽然不知道还有没其他的方法可以进行传递,但至少在我自己的实验中还没办法实现。
所以,如果是第二种情况的话,一般来说比较简单的方式就是先在flash中实现一个api,通过这个api传递某个js的全局函数名称,然后在flash的事件中调用该函数,如:
在flash中输入下面的as代码:
import flash.external.ExternalInterface;
var events:Object = {};
// 注册js可以调用的api
ExternalInterface.addCallback("addEventListener", addEventListener);
function addEventListener(key:String = null, value:String = null):Boolean
{
if (key == null || value == null) return false;
switch (key)
{
case "complete":
events.complete = value;
return true;
// 用类似的方式添加其他事件
}
return false;
}
然后在flash的某个事件中,调用js函数:
import flash.events.Event;
import flash.external.ExternalInterface;
function complete_handler(event:Event):void
{
if (events.complete != null)
ExternalInterface.call(events.complete);
/*
如果需要传递参数,请用下面这句:
ExternalInterface.call(events.complete, 参数1, 参数2...);
*/
}
现在,js可以通过下面的代码监听时间了:
// swf是你的flash object对象,自行获取吧
swf.addEventListener("complete", complete_handler);
function complete_handler()
{
alert("事件监听成功啦~!");
}
可是,上面的监听方式有个缺点,就是如果事件的参数不是固定的,参数传递会很麻烦。或者在有的情况下我还是希望用回调函数的方式来监听flash事件呢,那么可以在js中做一个事件代理:
var flash = {
types: {},
event: function (type)
{
var listeners = this.types[type];
if (listeners)
{
for (var i = ; i < listeners.length; ++i)
{
listeners[i]();
}
}
},
addEventListener: function (type, fn)
{
if (!this.types[type])
{
this.types[type] = [];
}
this.types[type].push(fn);
}
};
flash.addEventListener("load", load);
flash.addEventListener("complete", function ()
{
alert("加载完成~!");
});
function load()
{
alert("正在加载~!");
}
然后在flash事件中调用下面代码:
import flash.events.Event;
import flash.external.ExternalInterface;
function load_handler(event:Event):void
{
ExternalInterface.call("flash.event", "load");
}
function complete_handler(event:Event):void
{
ExternalInterface.call("flash.event", "complete");
}
如果谁还有新的方法或思路,欢迎随时指教!
在Javascript中监听flash事件(转)的更多相关文章
- wemall app商城源码Fragment中监听onKey事件
wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享android开发Fragment中监听onK ...
- Fragment中监听onKey事件,没你想象的那么难。
项目中越来越多的用到Fragment,在用Fragment取代TabHost的时候遇到了一个问题,我们都知道,TabHost的Tab为Activity实例,有OnKey事件,但是Fragment中没有 ...
- 【Layui__监听button】在form中监听按钮事件
1. 前言 在使用form表单的按钮时,点击按钮总是页面刷新,代码如下 <button class="layui-btn" lay-submit lay-filter=&qu ...
- Vue中监听 键盘事件及修饰符
键盘事件: keyCode 实际值 48到57 0 - 9 65到90 a - z ( A-Z ) 112到135 F1 - F24 8 ...
- jquery JavaScript如何监听button事件
下面的html页面中有两个按钮 <div class="layui-tab-item layui-show"> <form class="layui-f ...
- vue监听滚动事件
vue中监听滚动事件,然后对其进行事件处理,一般有:1. 滚动到顶部吸附: 2. 根据滚动的位置激活对应的tab键(锚链接tab键) 这两种方式的处理都是可通过监听scroll来实现 mounted( ...
- Vue 爬坑之路(七)—— 监听滚动事件 实现动态锚点
前几天做项目的时候,需要实现一个动态锚点的效果 如果是传统项目,这个效果就非常简单.但是放到 Vue 中,就有两大难题: 1. 在没有 jQuery 的 animate() 方法的情况下,如何实现平滑 ...
- JS 中的事件绑定、事件监听、事件委托
事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有 ...
- javascript事件监听与事件委托
事件监听与事件委托 在js中,常用到element.addEventListener()来进行事件的监听.但是当页面中存在大量需要绑定事件的元素时,这种方式可能会带来性能影响.此时,我们可以用事件 ...
随机推荐
- 7-11使用UNION合并查询
合并查询的语法: SELECT ...FROM 表名一 UNION SELECT ...FROM 表名二 合并查询的特点: 1: 合并表中的列的个数,数据类型数据类型相同或兼容. 2:UNION 默 ...
- 5-04用Sql语句创建表
用Sql语句创建表的基本语法: USE E_Market--指向当前所操作的数据库 GO CREATE TABLE CommoditySort--创建表的名字 { sortID int IDENTIT ...
- js判断当前的访问是手机/电脑
<script type="text/javascript"> var commonURL = 'http://www.xxx.com/'; function mobi ...
- PMP 第十二章 项目采购管理
1规划采购 2实施采购 3管理采购 4结束采购 1.合同的不同叫法?卖方的不同叫法? 2.规划采购管理的目的是什么?合同类型有哪些?不同的特点是什么?何种情况下应选择何种合同?自制或外购分析计算和合同 ...
- 在ubuntu中安装maven
安装环境 操作系统:ubuntu 14.04.1 server amd64 安装jdk 在安装maven之前,必须确保已经安装过jdk. 安装jdk的方法请参考文章<在ubuntu中安装jdk& ...
- Input对象的type类型
Input表示Form表单中的一种输入对象,其又随Type类型的不同而分文本输入框,密码输入框,单选/复选框,提交/重置按钮等,下面一一介绍. 1,type=text 输入类型是text ...
- 【Filter 页面重定向循环】写一个过滤器造成的页面重定向循环的问题
今天做一个过滤器,碰上页面重定向循环的情况: 浏览器的访问路径是:http://192.168.16.104:8080/biologyInfo/login/login/login/login/logi ...
- Laravel系列2入门使用
最好的教程是官方文档! homestead安装好,就可以使用了. 安装Laravel composer create-project --prefer-dist laravel/laravel blo ...
- HTML meta viewport属性说明(mark)
什么是Viewport 手机浏览器是把页面放在一个虚拟的“窗口”(viewport)中,通常这个虚拟的“窗口”(viewport)比屏幕宽,这样就不用把每个网页挤 到很小的窗口中(这样会破坏没有针对手 ...
- 使用openface(linux)
在github上搜索openface,clone下来; 按照requirement.txt中安装需要的项: sudo apt-get install .... sudo pip install ... ...