摘要:RIA技術的杰出代表Flash不單效果絢麗迷人,同時它也具有功能強大,易于編寫等特點,具有很強的數據溝通能力。該文通過具體例子,深入淺出的探索了Flash與Flash之間的自我數據交換和傳遞編程技巧。
關鍵詞:RIA;Flash;數據交換和溝通;LocalConnection;new SharedObject();xml
中圖分類號:TP317文獻標識碼:A文章編號:1009-3044(2008)34-1662-03
Exchange and Transfer of Flash Data
LI Zhi-sheng, LI Tao
(Network Engineering and Research Center, South China University of Technology, Guangzhou 510641, China)
Abstract: RIA technology distinguished represents Flash it’s not only effect is florid charming, at the same time, it also has characteristics such as powerful, compiling and composing easily, and the very strong data linking an ability up. Programming artifice exchanging and transferring the main body of a book by the concrete example , oneself data explaining profound theories in simple language between having probed Flash and Flash.
Key words: RIA; Flash; exchange and link a data up; LocalConnection; new SharedObject(); xml
目前, Web2.0和RIA技術在互聯網上得到充分的應用和發展,Web2.0作為新技術標兵的代名詞,他帶來的是信息共享方式的革新,而RIA(RICH Internet Applications富因特網應用程序)則是對網絡信息呈現方式/載體的革新,他結合了聲音、視頻和實時對話等等綜合通信技術以及強大的數據交換能力,給人們帶來了前所未有的網上用戶新體驗。無可置疑,RIA 已經成為目前互聯網技術發展的趨勢,而Flash目前已成為Internet歷史上最普及的RIA軟件平臺,Flash已經成功從原來單一的動畫制作軟件轉化為富媒體程序開發軟件。
Flash具有獨特的時間片段分割(TimeLine)和重組(MC嵌套)技術,結合ActionScritp的對象和流程控制,使得他在靈活的界面設計和動畫設計中顯得尤為出眾,FLASH PLAYER被業界稱為最靈活、最為小巧的前臺。ActionScript是 Flash 的腳本撰寫語言,它可以讓應用程序以非線性方式播放,并添加無法以時間軸表示的有趣或復雜的功能。ActionScript目前已經發展到2.0/3.0 版本,它是一種強大的、面向對象的編程語言,可以制作出極富感染力的 Web 內容。Flash作為RIA 網絡應用程序中重要的一元,具有較強的數據溝通能力,這其中包括flash與數據庫之間的溝通和swf文件與swf文件之間的自我溝通能力。本文下面將通過一些實例,來研究一下swf文件與swf文件之間的自我溝通能力。
在實踐的flash應用中,我們有時會遇到三種需要swf文件之間進行數據溝通的情況。第一種是在同一個Web頁面中,一個swf告訴另外一個swf其目前的情況,讓另外一個swf做出反應;第二種情況是在不同的Web頁面中,一個swf告訴下一個Web頁面的另外一個swf要執行什么樣的事情,好比有個廣告,有很多不同的選擇按鈕,點擊相應的按鈕就跳轉到對應的頁面,并會告訴下一個swf執行相應的操作;第三種情況是在不同的Web頁面中相同的swf,當要保留目前Web頁面中的某些狀態,并讓其在下一個Web頁面出現的時候仍然能保持這種狀態,這好比一個菜單,目前這位置是展開的,當頁面跳轉到下一個的時候,菜單還是那個菜單,但其仍然要保持展開。
我們來分析一下第一種情況:在同一個web頁面,分別在不同區域的兩個swf文件要進行數據通信,如圖1所示,當swf1文件產生一個變量X,接著這個X按指定方式發出,swf2在接收到發來的X變量后,馬上作出相對應的反應。
對于這種情況,我們可以采用“LocalConnection”——本地連接來完成這個功能。使用LocalConnection類,可以在相同瀏覽器運行的兩個單獨的swf文件相互通信,是兩個swf文件相互傳達信息的一種方式。
具體程序實現如下:
swf1代碼:
var movie1LocalConnent = new LocalConnection();//定義連接
submitButton.onRelease = function()//定義按鈕
{
movie1LocalConnent.send(\"sampleLCchannel\",\"sendVar\",dataToSend.text);//觸發按鈕就把數據發出
};
swf1的具體功能為接受用戶輸入數據,發出數據填充另一swf文件,頁面效果如圖2。
swf2代碼:
var receiving_lc:LocalConnection = new LocalConnection();//定義連接
receiving_lc.sendVar = function(aVar:String) //定義接受數據的文本框
{
_root.incomingText_txt.text = aVar
};
receiving_lc.connect(\"sampleLCchannel\");//接受數據
Flash2的具體功能為接受Flash1傳來的數據,頁面效果如圖3。
工作原理:使用本地連接從一個swf向另一個swf填充數據,在每個swf中都要先實例化一個localConnection對象,他們的共同紐帶是sfw2中的connet()方法內指定的參數,當swf1觸發connect()時,就會創建一個localConnection對象,swf2就通過特定方式得到了數據。
第二種情況:在不同的Web頁面中,當上一頁面Web1要給下面觸發的頁面傳遞數據,如圖所示,Web1的swf1文件向Web2的swf2文件傳遞數據X,用于顯示Web1留下的信息或依照Web1的體驗來定制Web2的訪問形式。如圖4。
對于這種情況,通常可以利用共享對象在本地存儲數據,也就是Flash cookie,在用戶端留下有效信息,為后面要訪問的頁面達成數據通信。
Swf1代碼:
var obj = new SharedObject();//定義本地共享對象
on(release){
obj = SharedObject.getLocal(\"testkookie\",\"/\");
obj.data.record = 2;
obj.flush(100);
getURL(\"/product06/product/product.html\",\"_blank\");
}
Flash1為n個按鈕的集合,每觸發一個按鈕就給本地共享付給一個不同的值,然后跳轉頁面。
Swf2代碼:
var sharedobj = new SharedObject();
sharedobj = SharedObject.getLocal(\"testkookie\",\"http://www.***.com/\");//從對應路徑中讀出共享對象的值
switch (sharedobj.data.record) {
case 1:
//trace (\"case 1 tested true\");
_root.myXML.load(\"01.xml\");
break;
case 2:
//trace (\"case 2 tested true\");
_root.myXML.load(\"02.xml\");
break;
case 3:
//trace (\"case 3 tested true\");
_root.myXML.load(\"03.xml\");
break;
……
case 17:
_root.myXML.load(\"17.xml\");
break;
default:
_root.myXML.load(\"01.xml\");
}
//sharedobj.clear();
System.useCodepage = true;
Swf2讀出一個本地共享值,根據不同的值,調入對應的xml文件,產生不同的用戶體驗。
工作原理:swf1通過程序在客戶端建立一個共享(臨時)文件,保存下一個swf2所需要的數據,而當swf2打開的時候,會自動先讀入共享文件數據,根據實際數據來選擇下一步動作。
第三種情況:在上面的實際應用過程中,有時還會遇到在不同的Web頁面中使用同一個Flash產生不同用戶體驗或保持同一用戶體驗的情況,如圖5所示。
其實這就是Flash里面的自我通信,由于發生在不同Web上的同一個Flash,這里就必須完成輸出與輸入的功能。
下面是同一swf文件,保留當前狀態,轉換Web頁面后恢復之前的狀態的代碼:
temp = 1;//設定默認值
obj = new SharedObject();//定義本地共享對象
sharedobj = SharedObject.getLocal(\"kookie\");//讀出本地共享對象值
if (sharedobj.data.record != undefined) {//判斷是否對本地共享對象賦值,如果沒賦值則為新訪問用戶,如果有賦值,則是已在訪問的用戶
temp = sharedobj.data.record;
_root.gotoAndStop(temp);//跳轉到對應狀態
sharedobj.clear();//把本地再次值清空
} else {
_root.gotoAndStop(1);//如果是新訪問就停留在默認狀態
sharedobj.clear();
}
_root.circle.onEnterFrame = function() {//事件觸發
sharedobj.data.record = _root._currentframe;//把對當前幀的值賦給共享對象
sharedobj.flush();//存入本地共享文件
};
工作原理:swf1是在不同頁面中重復使用的,通過程序在客戶端建立一個共享(臨時)文件,保存下一個swf1所處的狀態,在下一個頁面打開的時候,swf1根據實際數據自動恢復到上一頁面的狀態。
SharedObject()會在用戶端產生一個臨時文件,比如瀏覽的網站名稱是www.test.com,其臨時文件存儲位置應該在客戶端的:C:\\Documents and Settings\\Administrator\\Application Data\\Macromedia\\Flash Player\\#SharedObjects\\846J2GEN\\www.test.com位置,這是一個動態生成的文件,知道臨時文件的位置可以方便我們了解程序的工作原理和測試調試編寫的程序。
Flash的自我溝通與通信在實際應用中為我們提供了更多的可能性,大大增強了頁面交互的能力,對頁面的多樣性帶來更多的幫助。Flash的溝通與通信還有多種方法,本文因篇幅關系在這只做常用方面的一些探討。
參考文獻:
[1] Derksen N,Berg J.ActionScript 2.0 編程入門經典[M].張蕾,譯.北京:清華大學出版社,2007.
[2] 魯琴.用LoadVars類實現Flash與數據庫的通信[J].中小學信息技術教育,2005(4).
[3] 段隆振,姚磊岳,黃水源,等.FLASH 類庫loadVars 功能擴充及其在富媒體中的運用[J].微計算機信息:管控一體化,2006,22(7-3).