在JavaScript与Flash的通信一文中我介绍了利用ExternalInterface来实现的JS与AS双向通信,有朋友跟我提出疑问如果AS或者JS中都定义了同名函数,那么会造成方法覆盖吗?这的确是个需要考虑的问题,通过测试证明,即使出现了同名方法的定义,它们也是相互独立的,不会造成方法覆盖。
一、AS调用JS方法时出现同名方法(查看实例)
AS代码如下:import flash.external.*; var v = ExternalInterface.available; t_btn.onRelease = function (){ //调用JS函数 var s = ExternalInterface.call("say","JS函数调用成功!") //调用AS本地函数 s += say("\n本地函数调用成功!"); r_txt.text = s; } //AS本地函数 function say(s){ return s; } HTML代码: //定义一个JS函数 function say(txt){ return txt; }
可以看到在JS中定义了一个say方法供AS调用,现在我们在AS中定义了一个同名的say方法来验证它们是否会出现覆盖。结果证明它们不会覆盖,都工作得很好。(PS:不错~)
二、JS调用AS方法时出现同名方法(查看实例)
AS代码如下://导入包 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] } } //定义一个JS本地函数 function say(s){ alert(s); } </script> </div>
可以看到在AS中定义了一个say方法供JS调用,现在我们在JS中定义了一个同名的say方法来验证它们是否会出现覆盖。结果证明它们不会覆盖,都工作得很好。(PS:也不错~)
通过上面的两个例子我们可以得出结论在使用ExternalInterface时即使定义了同名方法,也不会造成方法覆盖,你大可放心使用。 |