AS3学习笔记( 二)

来源:互联网 发布:电视盒子市场软件 编辑:程序博客网 时间:2024/04/27 15:42
【使用SharedObject及捕获异常】
var so:SharedObject = SharedObject.getLocal("so");
so.data.userName = "Youthoy";
try {
    var flushResult:String = so.flush(500 * 1024); //请求500KB容量
    //如果flush()没成功执行,就替netStatus加个事件处理函数以确认用户是同意还是拒绝,否则只检验结果.
    if(flushResult == SharedObjectFlushStatus.PENDING) {
        //替netStatus加个事件处理函数,使得我们可以检验用户是否同意以足够磁盘容量储存共享对象.当netStatus事件发生时,执行onStatus函数.
        so.addEventListener(NetStatusEvent.NET_STATUS, onStatus);
    }else if(flushResult == SharedObjectFlushStatus.FLUSHED) {
        //成功储存.把数据成功储存后你想执行的程序放在这里.
    }
}catch(e:Error) {
    //这里表示用户把本地储存设置为"拒绝".如果储存数据很重要,你会想在此警告用户.
    //此外,如果你想让用户可修改其设定值,可以用下面语句打开Player的"设置"对话框的本地储存页面.
    Security.showSettings(SecurityPanel.LOCAL_STORAGE);
}
//定义onStatus函数以处理共享对象的状态事件.flush()返回"pending"时,引发提示,而用户做了选择后所引发的事件.
function onStatus(event:NetStatusEvent):void {
    if(event.info.code == "SharedObject.Flush.Success"){
        //如果event.info.code内容是"SharedObject.Flush.Success",表示用户同意.把用户同意后你想执行的程序放在这里.
    }else if(event.info.code == "SharedObject.Flush.Failed"){
        //如果event.info.code内容是"SharedObject.Flush.Failed",表示用户同意.把用户拒绝后你想执行的程序放在这里.
    }
    //现在,移除事件监听器,因为我们只需监听一次.
    so.removeEventListener(NetStatusEvent.NET_STATUS, onStatus);
}

【向LSO储存对象时需要注意】
LSO使用二进制的AMF(Action Message Format)对一个对象进行编码.当你在LSO储存类对象时,该对象会编码成包含内容属性的普通对象.于是,当你试着从共享对象里读取该对象时,无法被读成某类的对象,因为没有类型数据.要克服这个限制,使用flash.net.registerClassAlias()方法.
任何影片中,只要从共享对象读取出自定义对象数据,自定义类就必须注册别名,而且调用registerClassAlias()方法时必须在SharedObject.getLocal()方法被调用之前.

【要相同域名内的两个影片可以存取相同LSO】
首先LSO是储存在以下目录下:
C:/Documents and Settings/[user name]/Application Data/Macromedia/Flash Player/#SharedObjects
例如,如果来自于http://www.riahome.cn/youthoy的影片movie.swf写入名为example的LSO,则数据会储存在以下位置:
C:/Documents and Settings/[user name]/Application Data/Macromedia/Flash Player/#SharedObjects/[random directory name]/riahome.cn/youthoy/movie.swf/example.sol
如果在这个movie.swf里的代码是这样的: var example:SharedObject = SharedObject.getLocal("example", "/"); 也就是使用了选用的本地路径参数,则LSO会储存在以下路径,注意到与以上路径少了"youthoy/movie.swf":
C:/Documents and Settings/[user name]/Application Data/Macromedia/Flash Player/#SharedObjects/[random directory name]/riahome.cn/example.sol
以此方法建立的LSO,可以由相同域的其它Flash影片用以下程序来读取:
var example:SharedObject = SharedObject.getLocal("example", "/");
再看一个例子:
有两个Flash影片movieOne.swf和movieTwo.swf都位于同一域(http://www.riahome.cn)内,但是,movieOne.swf位于http://www.riahome.cn/youthoy/firstGroup,而movieTwo.swf位于http://www.riahome.cn/youthoy/secondGroup.在这情况里,movieOne.swf可以用下列任何本地路径建立和读取LSO:
/
/youthoy
/youthoy/firstGroup
而movieTwo.swf可以用下列任何本地路径建立和读取LSO:
/
/youthoy
/youthoy/secondGroup
因此,如果你想要两个影片都可以读取相同LSO,当你调用getLocal()方法时,必须指定影片共享的两个本地路径之一(/或/youthoy).

【URLLoader.dataFormat的三种类型】
URLLoader.dataFormat的可选值是:
flash.net.URLLoaderDataFormat.BINARY
flash.net.URLLoaderDataFormat.TEXT
flash.net.URLLoaderDataFormat.VARIABLES
当dataFormat是BINARY时,URLLoader.data属性就是flash.utils.ByteArray类型;
当dataFormat是TEXT时,URLLoader.data属性就是String类型;
当dataFormat是VARIABLES时,uRLLoader.data属性就是Object类型.

【在XML内使用动态数据】
把变量放在大括号({和})内:
var userName:String = "Youthoy";
var myXML:XML = <person><userName>{userName}</userName></person>;

【新增一个节点元素】
//例子一:
var example:XML = <person/>;
example.father = <father/>; //内容属性和元素名称不一定要相同,也可以: example.abc = <father/>,但会以元素名称为准,即会建立一个<father/>元素
trace(example);
/*
输出:
<person>
  <father/>
</person>
*/
//例子二:
var example:XML = <person/>;
example.father = ""; //建立一个<father/>元素
trace(example.toString());
/*
输出:
<person>
  <father/>
</person>
*/
//例子三:
var example:XML = <person/>;
var id:int = 10;
example["user" + id] = "";
trace(example);
/*
输出:
<person>
  <user10/>
</person>
注意: 有些情况必须使用第三种情况.例如,元素节点名称内含连字符("-")是完全合法的,但在ActionScript里会得到编译器错误:
example.some-element = ""; //产生编译器错误
正确的写法是:
example["some-element"] = "";
*/

【新增属性】
var example:XML = <person/>;
example.element = "";
example.element.@name = "Youthoy";
example.element.@["bad-variable-name"] = "yes";
example.element.@other = ["riahome.cn", undefined, true, 44, null];
var id:int = 44;
example.element.@["user" + id] = "love";
trace(example);
/*
输出:
<person>
  <element name="Youthoy" bad-variable-name="yes" other="riahome.cn,,true,44," user44="love"/>
</person>
*/

【向XML插入文字元素和节点元素】
//在指定元素前和后插入,在最前端和尾端插入
var example:XML = <person/>;
example.two = "";
example.insertChildBefore(example.two, <one/>); //在two节点前插入one节点
example.insertChildBefore(example.two, "在two节点前插入文字");
example.insertChildAfter(example.two, <three/>); //在two节点后插入three节点
example.prependChild(<start/>); //在最顶端插入start节点
example.appendChild(<end/>); //在尾端插入end节点
example.start = "start内容"; //向节点增加内容
trace(example);
/*
输出:
<person>
  <start>start内容</start>
  <one/>
  在two节点前插入文字
  <two/>
  <three/>
  <end/>
</person>
*/

【把XML实例的内容属性转换为任何可以转换成字符串的内容】
//先把等号右边转为可以转换的字符串
var example:XML = <person/>;
example.one = "one";
example.two = new URLLoader();
example.three = new Sprite();
example.four = new Boolean; //Boolean对象的值初始化为false
example.five = new Number();
example.six = new String();
example.seven = {a:"Youthoy", b:true, c:undefined};
example.eight = ["three", undefined, true, 44, null];
/*
输出:
<person>
  <one>one</one>
  <two>[object URLLoader]</two>
  <three>[object Sprite]</three>
  <four>false</four>
  <five>0</five>
  <six/>
  <seven>[object Object]</seven>
  <eight>three,,true,44,</eight>
</person>
*/

【对XML属性层层递归的算法】
var example:XML = <menu>
                    <menuitem label="File">
                      <menuitem label="New"/>
                      <menuitem label="Save"/>
                    </menuitem>
                    <menuitem label="Help">
                      <menuitem label="About"/>
                    </menuitem>
                  </menu>;
walk(example);
function walk(node:XML):void {
for each(var element:XML in node.elements()) {
    trace(element.@label);
    walk(element);
}

【读取文字节点及其值】
var example:XML = <menu>
                    My name is Youthoy.
                    <myName>Youthoy</myName>
                  </menu>;
example.text(); //输出: My name is Youthoy.
example.myName.toXMLString(); //输出: <myName>Youthoy</myName>
//以下三行都输出: Youthoy
example.myName.toString();
example.myName.text();
example.myName;

【递归元素属性时读取属性名与其值】
var example:XML = <person name="Youthoy" age="21"/>;
    for each(var i:XML in example.attributes()) {
    trace(i.name() + "=" + i);
}
/*
输出:
name=Youthoy
age=21
*/
另类方法:
var example:XML = <person name="Youthoy" age="21"/>;
trace(example.@*[1]); //输出: 21

【不论层级地访问整个XML中指定的节点或属性】
使用后代存取器运算符..
例子1(对于节点元素):
var example:XML = <a>
                    <z>I am z.</z>
                    <b>
                    <c></c>
                    <z>I am z.</z>
                  </b>
                </a>;
trace(example..z.text()); //输出: I am z.I am z.
例子2(对于属性):
var example:XML = <person>
                    <a>
                      <item name="Youthoy" age="21"/>
                    </a>
                    <item name="Jimpa" age="21"/>
                  </person>
trace(example..@name); //输出: YouthoyJimpa

【删除节点元素,文字节点以及属性】
使用delete对单一项进行删除,要删除整个XMLList可以使用for循环以倒序形式进行删除,以避免迭代时需要改变数组索引问题.

【搜索XML的高级应用】
使用术语过滤.(condition),可结合正则表达式来使用.
例子:
var example:XML = <foodgroup>
<fruits>
  <fruit color="red">Apple</fruit>
    <fruit color="orange">Orange</fruit>
    <fruit color="green">Pear</fruit>
    <fruit color="red">Watermelon</fruit>
  </fruits>
  <vegetables>
    <vegetable color="red">Tomato</vegetable>
    <vegetable color="brown">Potato</vegetable>
    <vegetable color="green">Broccoli</vegetable>
  </vegetables>
</foodgroup>;
trace(example..*.(hasOwnProperty("@color") && @color == "red"));
/*
hasOwnProperty所做的检测是确保元素具有color属性,然后,有的话,就测试color属性之值是否为red.只有当条件的计算结果为true时,该元素才会加入EX4运算式所返回的XMLList.
输出
<fruit color="red">Apple</fruit>
<fruit color="red">Watermelon</fruit>
<vegetable color="red">Tomato</vegetable>
*/

【CDATA(Character Data)标签】
<![CDATA[]]>,必须大写.如果<![CDATA[[]]]>这样的话,它会告诉你语法错误的.

【一些名词】
RPC:
全称: Remote Procedure Call,台湾的朋友称其为: 远端程序呼叫
SOAP:
全称: Simple Object Access Protocol,台湾的朋友称其为: 简单物体存取协定
WSDL:
全称: Web Service Description Language,台湾的朋友称其为: web service描述语言
原创粉丝点击