事件處理常式裡的“this”問題
文∕趙英傑
讀者來信詢問《碼上就會:Flash 8動畫設計寶典》第十二章「製作互動選單介面」中的選單事件處理常式中,與“this”關鍵字相關的問題。問題的關鍵在於「事件處理常式」有兩種語法,以底下的格式來說(寫在關鍵影格中),this指的是item1「影片片段」實體內部的時間軸(請參閱書本12-17頁的for迴圈程式)。
item1.onRelease = function () { this.gotoAndPlay("out"); }
在上面的程式片段中,this.gotoAndPlay(“out”); 指的是控制item1本身(內部)的時間軸,跳到’out’標籤影格;如果您雙按該影片的選單項目元件,進入它的時間軸,就能看見out標籤影格是一個稍微放大的圖像。
相反地,若採用Flash的「行為」來建立事件處理程式(如書本12-15所示),它將採用底下的語法,把程式直接附加在按鈕(或影片片段實體)上:
on (release) { this.gotoAndPlay("close"); }
此時,this將有兩種截然不同的意義:
- 在「按鈕」物件上,this代表的是按鈕所在的時間軸;
- 在「影片片段」實體上,this仍是該實體內部的時間軸!
因此,書本12-5頁的透明按鈕「行為」指令中的this,代表的是「彈出式選單」元件的時間軸,而非該元件內部的時間軸。
相反地,如果要把上面的按鈕程式放到關鍵影格,事件處理常式就要改寫成(假設透明按鈕的實體名稱為“hide_btn”,如書本12-20頁所示):
hide_btn.onRelease = function () { // 沒有指定路徑,代表控制此按鈕所在的時間軸 gotoAndPlay("close"); }
或者:
hide_btn.onRelease = function () { // 指定路徑時,路徑的起始點是在「元件的內部」! // 因此按鈕所在的時間軸,是在「內部的上一層」。 this._parent.gotoAndPlay("close"); }