2012-01-05 44 views
1

這是我在Flash/AS3代碼,在一幀的動作:的Flash AS3得到函數內部父框架參考

import flash.events.Event; 

stop(); 

this.addEventListener(Event.ENTER_FRAME, loading); 

function loading(e:Event):void{ 

    var total:Number = this.stage.loaderInfo.bytesTotal; 
    var loaded:Number = this.stage.loaderInfo.bytesLoaded; 

    if (total == loaded){ 

     var splashTimer:Timer = new Timer(3000,1); 
     splashTimer.addEventListener(TimerEvent.TIMER_COMPLETE, splashTimer1); 
     splashTimer.start(); 
     function splashTimer1(evt:TimerEvent):void 
     { 
      //remove the enter frame event listener here 
      this.removeEventListener(Event.ENTER_FRAME, loading); 
      gotoAndPlay("3"); 
     } 

    } 

} 

我想刪除輸入框事件偵聽器(加載()),內該splashTimer事件處理程序,重定向到框架3.正如你所看到之前,我用:

this.removeEventListener(Event.ENTER_FRAME, loading); 

但它拋出了我一個運行時錯誤:

TypeError: Error #1006: removeEventListener is not a function. 
    at Function/<anonymous>() 
    at flash.events::EventDispatcher/dispatchEventFunction() 
    at flash.events::EventDispatcher/dispatchEvent() 
    at flash.utils::Timer/tick() 

這是因爲我相信它是通過「this」引用splashTimer1函數。

我該如何引用父框架,以便我可以刪除它的事件偵聽器。

請幫我一把。

感謝

+1

也許嘗試刪除'this.',或將'this'存儲在一個對象中。 – ToddBFisher 2012-01-05 06:25:23

回答

1

我會拉出功能,並將其放置在同一水平loading

this.addEventListener(Event.ENTER_FRAME, loading); 

function splashTimer1(evt:TimerEvent):void 
{ 
    //remove the enter frame event listener here 
    this.removeEventListener(Event.ENTER_FRAME, loading); 
    gotoAndPlay("3"); 
} 

function loading(e:Event):void{ 

var total:Number = this.stage.loaderInfo.bytesTotal; 
var loaded:Number = this.stage.loaderInfo.bytesLoaded; 

if (total == loaded){ 

    var splashTimer:Timer = new Timer(3000,1); 
    splashTimer.addEventListener(TimerEvent.TIMER_COMPLETE, splashTimer1); 
    splashTimer.start(); 

等等

然後this將引用影片剪輯,而不是嵌套功能。

你也可以添加一個穿針引線變種,如:

if (total == loaded){ 

    var splashTimer:Timer = new Timer(3000,1); 
    splashTimer.addEventListener(TimerEvent.TIMER_COMPLETE, splashTimer1); 
    splashTimer.start(); 

    var theMC:MovieClip = this; 

    function splashTimer1(evt:TimerEvent):void 
    { 
    //remove the enter frame event listener here 
    theMC.removeEventListener(Event.ENTER_FRAME, theMC.loading); 
    theMC.gotoAndPlay("3"); 
    } 

等等

,但我喜歡第一種方法更好。

+0

謝謝,WiseOldDuck。我遵循第一種方法,它的工作完美...! – Prashant 2012-01-05 07:25:00

0

讓我來解釋一下你的代碼中發生了什麼。

當我們在的addEventListener像下面的(你做或方式)聲明函數

object.addEventListener(event, function(){ 


}); 

的功能將在全局命名空間和功能this將引用全局對象內創建。通常我們使用代理變量來存儲類似情況下的對象實例。所以可以通過做以下操作來修復:

var _this = this; 
var splashTimer:Timer = new Timer(3000,1); 
splashTimer.addEventListener(TimerEvent.TIMER_COMPLETE, splashTimer1); 
splashTimer.start(); 

function splashTimer1(evt:TimerEvent):void 
{ 
    //remove the enter frame event listener here 
    _this.removeEventListener(Event.ENTER_FRAME, loading); 
    gotoAndPlay("3"); 
} 

但是通常我們會在Javascript中執行此操作。

代碼的結構必須改變。請參閱@WiseOldDuck發佈的anwser。這是在Actionscript中執行此操作的方法

+0

好的,謝謝你的見解,二極管。 – Prashant 2012-01-05 10:47:56