Link:INB Home|INB English| INB русский язык|INB العربية|INB Türkiye|INB فارسی|INB Español|INB Français|INB Português|INB Deutsch|INB 國語|INB 中文|INB 日本语|INB 한국어|INB ภาษาไทย|INB tiếng Việt||FL 教程Flash AS3中數據發送與接收
INB 國語論壇
歡迎光臨(工業與草根研究員)對工業時代充滿了戰鬥精神,你和我都通過網絡空間與當地草根精神研究員來到瘋狂實驗室。家inbforum.com,永久名稱:tw-inbforum.forums2u.com
INB 國語論壇
歡迎光臨(工業與草根研究員)對工業時代充滿了戰鬥精神,你和我都通過網絡空間與當地草根精神研究員來到瘋狂實驗室。家inbforum.com,永久名稱:tw-inbforum.forums2u.com
INB 國語論壇

歡迎光臨(工業與草根研究員)對工業時代充滿了戰鬥精神,你和我都通過網絡空間與當地草根精神研究員來到瘋狂實驗室。家inbforum.com,永久名稱:tw-inbforum.forums2u.com


您沒有登錄。 請登錄註冊

《《《《《《《上一页INBforum   向下

上一页INBforum》》》》》》》上一篇主題 下一篇主題 向下  內容 [第1頁(共1頁)]

1FL 教程Flash AS3中數據發送與接收 Empty FL 教程Flash AS3中數據發送與接收 周四 3月 03, 2011 7:24 am

Admin

Admin
Admin
先回顧一下as2中相關的解決辦法

相信大部分人用的都是LoadVars類吧

1 var xianshi_lv = new LoadVars();
2 xianshi_lv.bianliang1 = "變量一";
3 xianshi_lv.bianliang2 = "變量二";
4 xianshi_lv.bianliang3 = "變量三";
5 xianshi_lv.sendAndLoad("http://10.7.87.222/show.asp? bianliang=" random(9999), xianshi_lv, "post");
6 xianshi_lv.onLoad = function(chenggong:Boolean) {
7 if (chenggong) {
8 trace(xianshi_lv)
9 };
}


  • 第1行:定義LoadVars對象,這家伙在as2時代幾乎把所有連接外部數據的事情都做完了。無敵!
  • 第2 3 4 行:在LoadVars對象中存儲變量,直接發送到外部腳本中。
  • 第5行:執行sendAndLoad方法,意思是send后,load回調的數據。
  • 第6行:onLoad事件,判定load回調數據,
  • 第7行:判定load回調是否成功。


在as2時代,LoadVars類把存儲變量,連接外部數據,接受回調數據這些事情都做完了。筆者也弄很久的as2,覺得這方法不錯,學習起來也很簡單。
但是as3不同,為了分工清楚,把上面的存儲變量,連接外部數據,接受回調數據這幾個事情都分散開了。一定程度上,本人覺得有點麻煩。不知道adobe是怎么想的。也許是本人還沒發現adobe的真正意圖·
既然as3來了,還是按他的規矩辦吧
他是什么規矩呢?

第一部分:預備發送數據

1:考慮連接的外部url地址了





as2中把url地址,變量,通通寫到LoadVars類里面。變量少沒什么,要是變量多起來,那就有點麻煩,遇上要動態修改變量那更加麻煩了。
as3索性把把這一部分又分為兩塊,統一到URLRequest對象里面。單純的url地址用URLRequest.url表示,變量用
URLRequest.data表示。修改起來方便許多。

注重url地址也可以在使用URLRequest構造函數的時候寫進去。





2:數據傳送方法,post還是get

as3狠了心了,要把它分的徹徹底底。把傳送方法也弄到URLRequest對象里面去。用URLRequest對象的method屬性表示。

同時也有兩種定義改屬性的方法:

request.method = URLRequestMethod.POST;//幫助文件中多用這種定義方式
request.method = "post";





以上兩句是等效的。你可以試試trace(URLRequestMethod.POST)。輸入是 post。
由于as3的默認method是get,建議都顯示定義為post。






.Cck173 { display:none; }



第二部分:發送數據

1:整合send和load,就用一個load。

as2中,有單獨的load和send,還有sendAnaLoad。個人覺得前兩個函數沒用,既然是和外部數據通訊,每一個與外部的連接中,都需
要檢查flash的狀態和外部數據的狀態,才能保證雙方的通信正常。那么load和send就丟掉,用一個就行了。ADOBE把剩下的
sendAndLoad()統一改成load,不僅邏輯結構上更加合理,就連書寫都簡單了一半。



相關語法:

URLLoader () 構造函數
public 函數 URLLoader(request:URLRequest = null)





注重括號中是個URLRequest對象。已經把url地址,變量,方法都包括進去了。URLLoader對象現在執行的就是連接數據,接受數據兩
個事情,其他的都交給URLRequest對象治理。因為URLLoader對象還有很多事情要做,比如偵聽連接數據和接受數據的情況,是否已經完成操
作,或者已經完成到什么程度。在這里就大有文章了,各種各樣的loading都需要URLLoader對象的bytesLoaded屬性和
bytesTotal 屬性實現。所以說,as3的分工還是很有道理的。






下面給出預備數據,連接外部數據的典型代碼.接受數據處理數據將在下一步討論

var request:URLRequest = new URLRequest("http://10.7.87.222/test.asp");
[您必需注冊登錄才能查看本鏈接。] = "text/xml";//這句代碼可以自己單獨嘗試一下。筆者初學,也沒具體去研究這個。只知道傳遞接收xml數據的時候有用。呵呵
request.data = "bianliang=100";
request.method = "POST";
var loader:URLLoader = new URLLoader();
loader.load(request);

附asp代碼,需要在iis5以上伺服器上測試.保存文件為 UTF-8編碼,文件名為test.asp.位于站點根目錄下.





<%@LANGUAGE="JAVASCRIPT" CODEPAGE="936"%>
<%
var bianliang=Request("bianliang")
Response.Write("&biangliang=" bianliang)
Response.Write("&chenggong=chenggong")
%>





第三部分:接受數據

我想提示的有兩點是:

1 數據需要加載完成以后,才能被flash使用.
所以一定要判定是否加載完成
但是所用的語句與as2已經完全不同了.
as2使用onLoad事件
as3代碼如下





loader.addEventListener(Event.COMPLETE,completeHandler);
function completeHandler(event:Event):void {
trace(loader.data);
}





目前大家只要熟悉到數據的加載情況必須用事件偵聽就行了.





其實as3中的交互事件,都已經采用上面代碼所有的事件偵聽模式.





2 需要區分 URLRequest類的data屬性與URLLoader類的data屬性
前者是表示傳遞變量的一個集合,后者是接受到的數據的一個集合.
別搞混就行了.





假如這一部分要深入下去,涉及的東西就比較多了.
包括xml的處理,和字符串的處理.
各位可以先把上面說的東西先弄熟悉了.
然后再學習怎么處理數據,以便flash使用.
再此就不再過多敘述了,因為已經跑題了.

差不多講完了?
NO ,我想還有個東西需要單獨提出來說說






.Tis400 { display:none; }



第四部分:如何組織發送的變量?





as2中的loadvars類,它是用n個屬性保存變量
as3使用URLRequest類的data屬性保存變量.
使用一個屬性保存變量?
更絕的是,該data屬性是一個object值.靠!
理論上說,我們已經可以把as3中的任意東西傳送給外部腳本.
現實一點來說,
將data屬性定義為一個string類型,
就已經能實現我們的簡單需求了
比如傳遞多個變量
URLRequest.data="變量1=1&變量2=2&變量3=3",
只要會一定的字符串操作,就能很好的組織自己想發送的數據了.
站巨人肩上,我們再想一下
假如有n個變量,(n的值可以讓人操作n個字符串的時候發狂.呵呵)
假如是loadvars類,那沒辦法,還是老老實實的一個一個寫吧
as3中,怎么弄?怎么弄?怎么弄?怎么弄?怎么弄?怎么弄?
既然data屬性是個object值.
又需要保存很多數據.
那么有個詞已經呼之欲出了
數組!
說到這里我就卡住了,
我再考慮,數組這部分究竟就該具體的說一下 ,還是略去.
考慮2分鐘.................





既然能學到今天的as3想必已經是as2老手了,數組操作不講也罷了
假如是新手剛入門,估計您應該先去as2版塊找找數組的資料
呵呵 小弟這里就偷偷懶 見諒了

最后提示一個
假如你還是喜歡as2的書寫方式。
as3還是可以滿足你的。
參考URLVariables類。
代碼如下:

var variables:URLVariables = new URLVariables();
variables.exampleSessionId = new Date().getTime();
variables.exampleUserLabel = "guest";
request.data = variables;





前面3句代碼似曾相識吧
完全和as2的loadvars類一樣,
只不過最后還是需要把URLVariables對象賦值給URLRequest對象的data屬性。

URLRequest.data中大有文章,它是一個Object值。理論上來說就可以傳遞任何東西,無論是可視對象還是不可視的其他對象(各種
類),但是對于與外部腳本通信來說,我們需要的僅僅是name=value 如此格式的字符串,然后用 &符號連接而已。
在As3中組織需要傳遞的變量,推薦的做法是用URLVariables類。
說白了,就是剝奪了政治權利的 LoadVars類,然后給改名成了URLVariables類。
具體的方法和屬性,參考一下幫助文件就行了
下面給出一個范例代碼,也是在上文中出現過的:

var request:URLLoader=new URLLoader
var variables:URLVariables = new URLVariables();
variables.變量一 = "變量一"
variables.變量一 = "變量二";
request.data = variables;
trace(variables)
trace(request.data)

從trace的結果應該知道,variables已經將自己的幾個屬性以及屬性值用&連接起來了。
當初我還以為可以在URLRequest.data上大做文章,隨著進一步的學習和實驗,發現,其實用數組來組織需要傳遞的變量其實沒什么必要了,也不能直接實現。
為什么說不能直接實現呢?看一個例子就知道了
下面我們令URLRequest.data等于一個數組,看代碼:

var my_arr:Array=new Array();
my_arr[0]= "123"
my_arr[1]= "456"
var request:URLLoader=new URLLoader
request.data=my_arr
trace(my_arr)
trace(request.data)
Trace結果都是 123,456





這樣的結果用于傳遞變量到外部腳本肯定是不能用的。
外部腳本能夠接受的變量形式首先要求是name=value配對,然后是用&連接。
相對于能自動組織變量的URLVariables類來說,用數組的方法真是有點麻煩。


.Ays815 { display:none; }



但是我們還是要看到數組操作的好處,能遍歷,能循環操作。
所以,小弟認為只要您需要的數據能用一個通項(或者多個參數)來表示或者具有一定的規律,可以用數學關系描述,用數組也能為你提高工作效率。
但是我們還需要對數組進行一定的加工,才能用。

加工步驟一:





var my_arr:Array=new Array();
my_arr[0]= "變量一=123";
my_arr[1]= "變量二=456";
數組各項采用name=value形式,

加工步驟二:





var a:Number=my_arr.length;
var i:Number
my_arr[a]="";
for (i=0; i
my_arr[a]= my_arr[a] my_arr[i] "&";
}
trace(my_arr[a]);

遍歷所有數組項,用&符號連接各項,并添加到該數組的最后一項。
Trace得到變量一=123&變量二=456&,這樣就已經得到符合要求的字符串了。





加工步驟三:

var my_urlloader:URLLoader=new URLLoader()
my_urlloader.data=my_arr[a]
trace(my_urlloader.data)





將上面數組的最后一項賦值,即變量一=123&變量二=456&,給my_urlloader.data

初看起來,確實很麻煩。
偶無聊,于是給Array類prototype了一個新方法toloadvars,把上面說到的幾個步驟,進行了一定的集成,如下:





Array.prototype.toloadvars=function(URLrequest:URLRequest){
var i:Number
var a:Number=this.length
this[a]=""
for(i=0;i
this[a]=this[a] this[i] "&"
}
URLrequest.data=this[a]
return URLrequest.data
};

看看怎么用吧?新手又必要看,老鳥別笑我
舉個例子:

Array.prototype.toloadvars=function(URLrequest:URLRequest){
var i:Number
var a:Number=this.length
this[a]=""
for(i=0;i
this[a]=this[a] this[i] "&"
}
URLrequest.data=this[a]
return URLrequest.data
};
var arr:Array=new Array();
arr[0]="a=123"
arr[1]="b=456"
arr[2]="c=789"
arr[3]="d=abc"
var my_url:URLRequest=new URLRequest()
arr.toloadvars(my_url);
trace(my_url.data)


  • 第一步:把新定義的toloadvars方法復制到動作面板頂部,
  • 第二步:定義數組,用來組織變量,注重格式。這里就看個人發揮了。用的好,能大大提高效率。
  • 第三步:定義URLRequest對象
  • 第四步:調用數組的toloadvars方法,傳遞參數是my_url對象。


然后就開始執行自定義的toloadvars方法了,
該方法將自動將數組中定義的每一個變量,用&連接起來,然后將連接后的結果送到URLrequest.data屬性里面。

最后提示:最好將URLRequest對象的url,method都定義好,然后用數組組織變量,然后用toloadvars方法。這個思路會稍微清楚點,不會混亂。]

http://tw.inbforum.com

上一页INBforum   向下

上一页INBforum上一篇主題 下一篇主題 回頂端  內容 [第1頁(共1頁)]

這個論壇的權限:
無法 在這個版面回復文章

Copyright ©2009-2010 LTD Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.

IT:SINGLESERVGoogle谷歌翻译TranslateFORUMSOFTLAYERGoogle谷歌广告联盟AdSenseAsia

 

Free forum | ©phpBB | 免費論壇互助中心 | 違法舉報 | Cookies | Latest discussions