• JavaScript与Flash的通信


    当Flash置于HTML容器中时,经常会遇到AS与JS的通信问题,例如:JS能否调用AS中的变量、方法,AS能否调用JS中的变量、方法等等。答案是肯定的。随着技术的不断发展,解决方案也是多种多样的。
      在我总结的HTML与FLASH之间的“静态”传值一文中提到了JS使用SetVariable方法来设置FLASH中的变量,认为此法已经过时。对此我表示同意,但上文重点毕竟不是在讨论JS与AS的通信,因此另外对AS与JS通信做一个个人总结,欢迎大家讨论。
      实现JS跟AS的通信,目前可选方法比较多,但早期的方法在使用便捷和功能上都不是很完美,下面做一简要说明:

      一、getURL  getURL("javascript:history.go(-1)");

      通过URL协议来访问页面中的javascript,上面控制浏览器历史的代码很眼熟吧,诸如此类我们平时在定制页面收藏,发送邮件时都会经常使用这种方式。虽然你也可以调用页面中自己定义的JS函数,但我个人认为局限性还是比较大,函数的参数传递并不是很灵活,无返回值,而且只能实现AS调用JS,反之不行。

      二、fscommand命令
      使用fscommand来调用AS定义的方法也是一个很常用的方式,但我们需要在HTML页面中定义一个具有规定格式的myFlash_DoFSCommand函数,首先定义这个函数我个人就觉得麻烦,而且也只能实现AS调用JS,无函数返回值。

      三、SetVariable  
      上面两种方法都只能实现AS调用JS,而SetVariable恰恰相反,只要我们稍微做下处理,他就可以帮我们变相调用AS中的方法。大概思路如下:AS中设置一个状态变量,并使用Object的watch方法对其监视,JS通过SetVariable来修改这个状态变量,一旦侦测到了变量的改变,那就可以根据不同的状态值来选择执行AS中的相应函数了。如果需要考虑用户的低版本播放器,那么你可以考虑下该方法,个人认为还是比较灵活的。

      可以看出上面的这些做法都有一定的局限性,所以在我们的应用中很多时候都不得不将他们结合使用。而下面我要具体介绍的就是ExternalInterface的做法,通过它你能轻松实现AS与JS的双向方法调用,从而也解决了双向的变量访问,详细介绍可参见FLASH帮助文档和Adobe的官方教程,下面用两个简单例子来说明ExternalInterface的使用。

    一、AS调用JS的方法(实例演示)

    Flash中代码:
    //导入包
    import flash.external.*;
    get_btn.onRelease = function(){
    //调用页面中的JS函数
    var temp_str = String(ExternalInterface.call("say", "Hello,World"));
    result_txt.text = temp_str;
    }

    Html中代码:function say(txt){
    return txt;
    }

      没错,就这么简单,JS函数定义没有任何要求,AS中使用call方法直接调用就可以了。

    二、JS调用AS的方法(实例演示)

    FLASH中代码://导入包
    import flash.external.*;
    //提供JS访问的函数名
    var _method:String = "say";
    //指定本地函数中this变量的作用域,可设置为null留空
    var e_area:Object = null;
    //AS内部函数名
    var method:Function = say;
    //将函数注册到容器列表
    var wasSuccessful:Boolean = ExternalInterface.addCallback(_method, e_area, method);
    //查看注册是否成功
    if(wasSuccessful){
    result_txt.text = "函数注册成功";
    }
    //本地的函数
    function say(txt:String) {
    result_txt.text = txt;
    }

    Html中代码:<div>
    <form>
    <input type="button" onclick="callExternalInterface()" value="JS调用AS方法" />
    </form>
    <script>
    function callExternalInterface() {
    thisMovie("demo").say("Hello,World");
    }
    //浏览器兼容访问DOM
    function thisMovie(movieName) {
    if (navigator.appName.indexOf("Microsoft") != -1) {
    return window[movieName]
    }
    else {
    return document[movieName]
    }
    }
    </script>
    </div>

      其中红色代码是核心代码,其作用原理是AS端通过addCallback函数把AS内部定义的方法注册为可从容器中调用,允许自定义另外一个方法名供JS来调用这个方法,函数调用成功返回true,失败返回flase,在此例中通过wasSuccessful变量来判断函数是否注册成功。函数注册成功以后,JS可以通过DOM来访问SWF对象,然后直接调用预定义的方法即可。
      
      通过比较可以看出,使用ExternalInterface来完成AS和JS的通信,代码可以更简洁,更清晰,功能也更强大,不过还有些细节你需要了解,需要使用8.0以上的播放器,对于调用的JS函数不能使用递归,同时安全域限制也必须在考虑之中

  • 相关阅读:
    datanode报错Problem connecting to server
    使用命令查看hdfs的状态
    Access denied for user root. Superuser privilege is requ
    ElasticSearch默认的分页参数 size
    SparkStreaming Kafka 维护offset
    【容错篇】Spark Streaming的还原药水——Checkpoint
    251 Android 线性与相对布局简介
    250 Android Studio使用指南 总结
    249 如何解决项目导入产生的中文乱码问题
    248 gradle更新问题
  • 原文地址:https://www.cnblogs.com/xiaochao1234/p/3803854.html
Copyright © 2020-2023  润新知