02月23, 2012

使用 Flash LocalConnection 解决 IE6/7 postMessage

关于跨域数据交互的总结,请看奇舞团JerryQu的文章 http://www.imququ.com/post/84.html

我们今天聊的主要是 HTML5的新特性 postMessage(跨文档消息传输,使用方式), 这个是个好东西, 网上也有大量的总结。

postMessage 是 IE8, Firefox3, Opera9, Chrome3和 Safari4 支持的。

那么万恶的IE6也想用怎么办?

  1. 可以通过实时监听 window.name 或 location.hash , http://js8.in/752.html:倒数第二节的描述
  2. 通过 Flash LocalConnection。

Flash LocalConnection

该对象可在一个 SWF 文件中或多个 SWF 文件间进行通信, 只要在同一客户端就行,跨应用程序, 可以跨域。

利用与JS交互,可以实现JS跨域通信。

以下示例代码, 通过 flashobj.SendMessage('msg') 发送消息。

其它页面收到消息后, 会调用 window.ReceiveMessage(msg) 方法,通知消息。

Flash仅提供字符串传输和通知,如需结构化参数,需在JS里封装。

注意:

  1. 一次发送,最多传输40K的信息。超过40K,可以拆分发送,这个可以在AS里封装一下。
  2. connectionName, 要以下划线(_) 开头, 否则,flash会自动将域加在前面, 导致 connectionName 不同, 无法跨域通信。
package 
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.external.ExternalInterface;
    import flash.net.LocalConnection;

    /**
     * ...
     * @author panliu888@gmail.com
     */
    public class Main extends Sprite 
    {
        private var con:LocalConnection;
        private var con_name:String = "_localcon_phx_crossdomain";

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point

            initConnection();
            registerFunction();
        }

        private function initConnection():void
        {
            con = new LocalConnection();
            con.allowDomain("*");
            con.client = this;
            try {
                con.connect(con_name);
            } catch (ex:Error) {
            }
        }

        private function registerFunction():void
        {
            if (ExternalInterface.available) 
            {
                ExternalInterface.addCallback("SendMessage", sendMessage);
            }
        }

        private function sendMessage(msg:String):void
        {
            con.send(con_name, "receiveMessage", msg);
        }

        public function receiveMessage(msg:String):void 
        {
            if (ExternalInterface.available)
            {
                ExternalInterface.call("ReceiveMessage", msg);
            }
        }
    }
}

本文链接:https://75team.com/post/使用-flash-localconnection-解决-ie67-postmessage.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。