在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時即使定義了同名方法,也不會造成方法覆蓋,你大可放心使用