在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事件(转)的更多相关文章

  1. wemall app商城源码Fragment中监听onKey事件

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享android开发Fragment中监听onK ...

  2. Fragment中监听onKey事件,没你想象的那么难。

    项目中越来越多的用到Fragment,在用Fragment取代TabHost的时候遇到了一个问题,我们都知道,TabHost的Tab为Activity实例,有OnKey事件,但是Fragment中没有 ...

  3. 【Layui__监听button】在form中监听按钮事件

    1. 前言 在使用form表单的按钮时,点击按钮总是页面刷新,代码如下 <button class="layui-btn" lay-submit lay-filter=&qu ...

  4. Vue中监听 键盘事件及修饰符

    键盘事件: keyCode 实际值 48到57     0 - 9 65到90           a - z ( A-Z ) 112到135       F1 - F24 8            ...

  5. jquery JavaScript如何监听button事件

    下面的html页面中有两个按钮 <div class="layui-tab-item layui-show"> <form class="layui-f ...

  6. vue监听滚动事件

    vue中监听滚动事件,然后对其进行事件处理,一般有:1. 滚动到顶部吸附: 2. 根据滚动的位置激活对应的tab键(锚链接tab键) 这两种方式的处理都是可通过监听scroll来实现 mounted( ...

  7. Vue 爬坑之路(七)—— 监听滚动事件 实现动态锚点

    前几天做项目的时候,需要实现一个动态锚点的效果 如果是传统项目,这个效果就非常简单.但是放到 Vue 中,就有两大难题: 1. 在没有 jQuery 的 animate() 方法的情况下,如何实现平滑 ...

  8. JS 中的事件绑定、事件监听、事件委托

    事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有 ...

  9. javascript事件监听与事件委托

      事件监听与事件委托 在js中,常用到element.addEventListener()来进行事件的监听.但是当页面中存在大量需要绑定事件的元素时,这种方式可能会带来性能影响.此时,我们可以用事件 ...

随机推荐

  1. font-face使用备忘

    @font-face { font-family: 'SingleMalta'; src: url('./font/SingleMalta.ttf'); } @font-face { font-fam ...

  2. 企业QQ 增加在线交谈链接

    企业QQ的在线交流链接跟普通QQ的在线交流不一样,普通QQ的在线交流,可以在http://shang.qq.com/v3/widget.html生成:企业qq的链接可以按以下步骤添加: 第一步:引入企 ...

  3. Fiddler Tips

    使用代理服务器 点击 Tools -> Fiddler Options -> Gateway Fiddler 默认将使用刚打开Fiddler窗口时IE 设置的代理服务器,当然你也可以手动修 ...

  4. ubuntu下整合eclipse和javah生成jni头文件开发android的native程序(转)

    本文介绍两种利用javah命令生成jni头文件的方法,第一种为大众所知的javah命令,第二种为整合javah到eclipse里面.推荐第二种方式,方便快捷,随时修改随时生成 0:前提和条件: 1:u ...

  5. loj 1201(最大独立集)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26913 思路:水题一枚,就是求最大独立集.最大独立集=顶点数-最大 ...

  6. 通信原理实践(一)——音频信号处理

    一.信号的离散化 1.采样定理: –如果信号是带限的,并且采样频率fs超过信号最高频率的两倍,那么,原来的连续信号可以从采样样本中完全重建出来. 因此在仿真过程中,采样率(fs)是一个非常重要的参数. ...

  7. Emacs 之列编辑模式

    // */ // ]]> Emacs 之 列编辑模式 Table of Contents 1. Emacs 下列编辑模式常用命令 2. 可以参考 1 Emacs 下列编辑模式常用命令 先mark ...

  8. 记录Android Studio项目提交到github上的出错处理

    首先是按照网上的教程进行了一次提交,具体见http://web.gxzj.com.cn/News.aspx?id=325505 记得当时出现过这个错误Can't connect to reposito ...

  9. JMeter性能监测插件介绍(三)

    JMeter 性能监测插件介绍 压力测试过程中,能够随时对负载服务器的健康状况的把控是相当重要的,有了这些数据,我们才能准确分析出服务器负载瓶颈.JMeter 插件包现在能够支持服务器监控,可以在所有 ...

  10. js的一些小笔记,(不定期更新)

    2个$的用法$本身并无特定意义,它表示什么意思要看是如何定义的,如果没有定义就便是两个$,可能是变量名的开始.一般是一个函数,用来代替document.getElementByIdfunction $ ...