在這篇「loadVariables」vs.「LoadVars」(一)我們曾提及「loadVariables」vs.「LoadVars」資料傳送的差異,那我們該如何得知資料已載入完成了呢?是否有相對應的事件可以來協助我們呢?
「LoadVars」事件處理
利用「LoadVars」要得知資料是否已載入完成,其實是相當容易且直覺的,它提供了一個「onLoad」事件處理器來協助我們來達成實現,然而此事件是隸屬於系統事件(System Event),也就是它無法透過使用者來加以觸發的事件,而是仰賴Flash Player來觸發的,相反地,若是「onClick」等等之類的事件,則稱之為使用者事件(User Event),底下我們先來看此事件的描述:
onLoad Event Handler
public onLoad = function(success:Boolean) {}
此事件會在呼叫「LoadVars.load()」或「LoadVars.sendAndLoad()」結束時,才會由系統來加以觸發的事件,而系統會傳遞一個success參數作為判斷載入成功或失敗的變數。
範例如下:(data.txt是一個約1.8mb的文字資料,裡頭包含了「var0 ~ var99999」的變數資料,以及一個ok變數)
程式一
var data_lv:LoadVars = new LoadVars(); data_lv.onLoad = function(success) { if(success) { trace("Loaded!"); trace(this.ok); }else{ trace("Failed!"); } } data_lv.load("data.txt");
結果:
Loaded! 1
此「onLoad」事件的確只會在「LoadVars.load()」或「LoadVars.sendAndLoad()」結束時才會觸發的事件。
「loadVariables」事件處理
相較於「LoadVars」來說,要判斷「loadVariables」是否已完成載入資料,便顯得較為煩瑣些,雖然使用「loadVariables」會觸發「MovieClip.onData」事件,但值得注意的是並不是只有「loadVariables」才會觸發此事件,「loadMovie」也會觸發此一事件,而且還必須作些手腳來達成判斷資料是否已「完全」載入,我們先看下述這個範例:
程式二
this.loadVariables("data.txt"); this.onData = function() { if(this.ok == undefined) { trace("Loading..."); }else{ trace("Loaded!"); trace(this.ok); } }
結果:
Loading... Loaded! 1
從執行的結果上來觀察,我們可以知道「onData」這個事件至少被系統呼叫了「兩」次,這也就是為何筆者需要加上一個「ok」變數資料在「data.txt」文件上,那是否還有額外的方式可以處理呢?其實我們也可以利用「MovieClip.onEnterFrame」來做個輪詢的方式來偵測資料是否已載入完成,或是利用「setInterval」來協助我們達成,底下是個別的作法:
setInterval
this.loadVariables("data.txt"); function checkParamsLoaded() { if(_root.ok == undefined) { trace("Loading..."); }else{ trace("Loaded!"); trace(_root.ok); clearInterval(param_interval); } } var param_interval = setInterval(checkParamsLoaded, 100);
結果:
Loading... Loaded! 1
MovieClip.onEnterFrame
this.loadVariables("data.txt"); this.onEnterFrame = function() { if(this.ok == undefined) { trace("Loading..."); }else{ trace("Loaded!"); trace(this.ok); delete this.onEnterFrame; } }
結果:(根據你的FPS而定,筆者環境FPS=30)
Loading... Loading... Loaded! 1
本文若有任何謬誤,希望請不吝地賜教,若能指正不勝感激。