1 FL 教程Flash AS3中數據發送與接收 周四 3月 03, 2011 7:24 am
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 };
}
在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.data屬性里面。
最后提示:最好將URLRequest對象的url,method都定義好,然后用數組組織變量,然后用toloadvars方法。這個思路會稍微清楚點,不會混亂。]
相信大部分人用的都是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方法。這個思路會稍微清楚點,不會混亂。]