AS 呼叫 JS 與 JS 呼叫AS

[[AS 呼叫 JS]]
AS

import flash.external.ExternalInterface;

_btn.addEventListener(MouseEvent.CLICK,function(e:Event){
ExternalInterface.call("AScallJS");
});
val_btn.addEventListener(MouseEvent.CLICK,function(e:Event){
ExternalInterface.call("AScallJSVal","我是參數");
});

JS

function AScallJS(){
alert("AS call JS");
}
function AScallJSVal(val){
alert("AS call JS,val="+val);
}

Flash arguments類別 (AS3.0)

arguments類別是function 在用的,看help文件只有兩個屬性:

callee : Function 目前正在執行之函數的參照。
length : Number 傳遞給函數的引數數目。

Flash addFrameScript方法 (AS3.0)

我 不習慣把程式碼寫在元件中,但有偏偏會碰到非要某個元件某個影格時執行的程式。
例如:1個MovieClip有20個影格,我要在它跑到第10個影格時先暫停。
很直覺的寫法是在它第10個影格下stop();語法。
最近我是完全不寫程式碼在影格甚至主時間軸中,全部抽到.as檔

之前會用監聽EnterFrame事件來抓影格編號:

_mc.addEventListener(Event.ENTER_FRAME,function(e:Event){
if(_mc.currentFrame==10){
_mc.stop();
e.target.removeEventListener(e.type,arguments.callee);
}
});

我覺得很麻煩,又要監聽又要移除 =.=
倒不如使用

_mc.addFrameScript( 9,stopFun);//第10個影格,參數填9;第1個影格則參數填0,類推...
function stopFun(){
_mc.stop();
}

可簡化成:

_mc.addFrameScript( 9,_mc.stop);


若是要帶參數,就改成:

function myFun(str:String):Function {
var my_fun:Function = function (){
trace("參數值="+str);
}
return my_fun;
}

_mc.addFrameScript(9,myFun("我是參數"));


但有幾點要注意
1.使用這種方式,只要播放到這個影格,就會執行程式。
例如:
_mc.gotoAndStop(10)//執行
_mc.nextFrame();//下一個影格剛好是影格10,執行
_mc.prevFrame();//上一個影格剛好是影格10,執行
_mc.play()//影格播放經過影格10,執行
2.影格不存在,不會出現錯誤,但也沒作用
例如我_mc.totalFrames只到5,那_mc.addFrameScript( 9,_mc.stop);就沒作用
3.已經為指定的影格加程式碼了(不論是下在影格或是使用addFrameScript),又再加一次,新的會覆蓋掉舊的。
ex:
同時下了這兩行:
_mc2.addFrameScript(9,myFun("我是參數2"));
_mc2.addFrameScript(9,myFun("我是參數3"));
只會執行_mc2.addFrameScript(9,myFun("我是參數3"));