在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 = 0; 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");
}

如果谁还有新的方法或思路,欢迎随时指教!

转载于:https://www.cnblogs.com/coolsundy/p/4262897.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用以下代码在JavaScript使用WebSocket进行下载: ```javascript // 创建WebSocket对象 const socket = new WebSocket('ws://example.com/download'); // 监听连接成功事件 socket.onopen = function(event) { console.log('连接成功'); // 发送下载请求 socket.send('download'); }; // 监听接收消息事件 socket.onmessage = function(event) { const data = event.data; if (typeof data === 'string') { // 如果接收到字符串类型的数据,说明下载完成 console.log('下载完成'); console.log('接收到的数据:', data); // 关闭WebSocket连接 socket.close(); } else { // 如果接收到二进制数据,说明正在下载 console.log('正在下载...'); console.log('接收到的数据长度:', data.byteLength); // 可以根据需要进行处理,比如保存到文件 // saveToFile(data); } }; // 监听连接关闭事件 socket.onclose = function(event) { console.log('连接关闭'); }; // 监听连接错误事件 socket.onerror = function(event) { console.error('连接错误'); }; ``` 请确保将`ws://example.com/download`替换为您实际的WebSocket服务器地址。在上述代码,我们创建了一个WebSocket对象,并通过`onopen`事件发送了下载请求。在`onmessage`事件,我们可以处理接收到的数据,根据数据类型进行相应的操作,比如保存到文件。最后,在`onclose`事件关闭WebSocket连接。 注意:WebSocket下载可能需要服务器端的支持。服务器需要相应的WebSocket处理逻辑来接收下载请求,并根据请求返回相应的数据。具体的实现方式取决于您的服务器端技术栈。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值