当前位置: 首页 > 图文教程 > Flash动画 > ActionScript > Flash AS3中数据发送与接收

ActionScript
FLASH AS3与网页JS参数值传递的问题
Flash AS3的parameters对象处理网页参数
Flash教程 认识Flash ActionScript的环境
Flash ActionScript编程基础
Flash AS3代码实现鼠标跟随喷枪涂鸦效果
falsh 跨域调用配置
Flash AS3.0 实例教程 喷泉动画特效
AS3 Loader与URLLoader的比较
ColorTransform类调整显示对象的颜色值
Flash AS3 快速制作烟雾动画
Flash AS3 制作文字飞出动画
ActionScript 学习小心得
ActionScript3.0读取网页FlashVars中的参数的问题
通过实例学习AS3.0:案例三
通过实例学习Flash AS3.0:案例四
通过实例学习Flash AS3.0:案例五
通过实例学习Flash AS3.0:案例六
Flash教程:认识Flash ActionScript的环境
Flash as入门(1):认识AS面板
Flash as入门(3):AS基本语法

ActionScript 中的 Flash AS3中数据发送与接收


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-16   浏览: 189 ::
收藏到网摘: n/a

先回顾一下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) {
8trace(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。


第二部分:发送数据
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");
//request.contentType = "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 ,我想还有个东西需要单独提出来说说


第四部分:如何组织发送的变量?
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类来说,用数组的方法真是有点麻烦。


但是我们还是要看到数组操作的好处,能遍历,能循环操作。
所以,小弟认为只要您需要的数据能用一个通项(或者多个参数)来表示或者具有一定的规律,可以用数学关系描述,用数组也能为你提高工作效率。
但是我们还需要对数组进行一定的加工,才能用。
加工步骤一:
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<a; 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<a;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<a;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方法。这个思路会稍微清晰点,不会混乱。