About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Jun

    29

    在 ActionScript3 中,XML 并不真正的原生类,而是作为一份基于 ECMA-262 官方标准的原生类的扩展使用(更多信息可查看《ActionScript3 基本数据类型与原生数据类型》)。XML 数据类型是 Live 性质的。

    Jun

    29

    套接字发布者许可基本格式分两种情况,如果是基于HTTP的方式来获取一个套接字许可的策略文件,那么它的基本格式与跨域策略文件一致(参考《跨域发布者许可(策略文件)使用方法详解》)。如果是基于套接字的方式来获取一个套接字许可的策略文件,那么它的基本格式与与跨域策略文件类似,但在 <allow-access-from> 标签中需要加一个 to-ports 属性。

    1、在基于套接字的方式取得策略文件时, to-ports 属性中使用 * 是一个通配符,并且基于获取时的端口号来分配这个 * 号的范围,如果获取时的端口号小于1024(但不包括 1024),那么 * 表示相关的 SWF 文件对任何端口的访问都被授权;否则 * 号表示大于或等于 1024 的任何端口都允许被相关的 SWF 文件访问(此时既便小于 1024 的端口被显式的写入,也是无效的)。

    在基于套接字的方式中,如果SWF文件在相同的端口取得套接字的策略文与正常通信,那么Flash 播放器自动创建一个单独的端口,并通过发送一个 <policy-file-request/> 协义让服务器来响应获取相应的策略文件,随后是正常的连接请求。如果是不同的端口,那么需要先使用如下代码,来手工的装载一个策略文件:

    Security.loadPolicyFile("xmlsocket://domainOrIP:portNumber");

    随后是相应的正常连接请求的代码(它也是自动等待套接字策略文件的,是一种“伪同步”,与获取跨域策略文件一样),实际上使用的是 Socket 类来连接,但前面加载策略文件中强制使用 xmlsocket:// 协议。

    2、在基于HTTP的方式获取套接字策略文件时,它有以下这些条件限制:

    ● 它必须被命名为crossdomain.xml

    ● 它必须放置于网页服务器的根目录中

    ● 它必须在所需要的套接字连接的域名或IP地址的端口80上提供服务

    ● 在AS3中,它必须使用Security.loadPolicyFile() 方法来加载(使用http://协议)。

    由于基于HTTP方式获取套接字策略文件的方式是为了向旧版本兼容,实际上并不推荐使用,因为它无法使用 to-ports 属性来指定相应的端口,取而代之的它只给大于或等于 1024 的所有端口授予访问权(它不可以对小于 1024 的端口授予访问权)。同样,基于 HTTP 方式获取策略文件时也是“伪同步”的。

    More...

    Jun

    28

    一个安全沙箱类型指一个 SWF 文件的安全状态,是一组安全限制规则;而一个安全域是资源一个逻辑上的集合。安全沙箱类型是由 Flash 播放器在打开 SWF 文件的位置,以及 SWF 文件在编译时安全回放设置共同决定的,或通过显示的设置对SWF文件所在的本地路径设置成可信任。安全域是资源存放的位置相关决定。

    Jun

    28

    策略文件往往被命名为 crossdomain.xml 的文本文件(非默认策略文件位置可以使用其它命名)。如果策略文件放在网站根目录,并命名为 crossdomain.xml(网站根目录是默认策略文件位置)会被自动加载,如果策略文件被放置在非根目录的其它任何位置,需要通过以下方式来加载:

    Security.loadPolicyFile("http://domainOrIP/pathToPolicyFile");

    策略文件在网站中的位置决定了资源文件集合可被加载的授权位置——存放的目录与该目录的子目录。使用 Security.loadPolicyFile() 方法时的代码是“伪同步”的(也就是在加载授权文件的代码后面可以直接添加加载操作的代码,它会自动等待策略文件的加载,加载完成后继续执行资源加载的代码——它是自动等待加载,但实际上并不会卡住播放器进程,所以是“伪同步”的)。一旦策略文件被加载成功,它的授权对所有以后进行的操作都有效。

    策略文件格式:

    <?xml version="1.0"?>
    <!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
    <cross-domain-policy>
    <allow-access-from domain="domainOrIP"/>
    </cross-domain-policy>

    样例1,任意数量的域名授权(包括IP):

    <?xml version="1.0"?>
    <!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
    <cross-domain-policy>
    <allow-access-from domain="example1.com"/>
    <allow-access-from domain="example2.com"/>
    <allow-access-from domain="example3.com"/>
    </cross-domain-policy>

    样例2,任意深度的子域名,包括一级域名本身:

    <?xml version="1.0"?>
    <!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
    <cross-domain-policy>
    <allow-access-from domain="*.example1.com"/>
    </cross-domain-policy>

    样例3,任意域(如果要包含本地范围的一个授权,就只能将策略文件通过 domain 属性 * 来显式的指定):

    <?xml version="1.0"?>
    <!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
    <cross-domain-policy>
    <allow-access-from domain="*"/>
    </cross-domain-policy>

    有了策略文件,在加载数据成功后,如果还需要访问被加载的数据,就需要在 AS 根据加载的数据类型来添加不同的代码,如果加载的是位图,在 Loader.load() 方法中需要添加 context 参数,也就是需要一个 LoaderContext 对象,并设置 checkPolicyFile 变量为 true;如果加载的是一个 MP3 文件,就需要一个 SoundLoaderContext 对象,并设置 checkPolicyFile 变量为 true。

    More...

    Jun

    28

    ActionScript3 只有三种基本数据类型:Null(唯一值null)、void(唯一值undefined)和 Object(all instances of all classes)。

    ActionScript3 原生类型:String、Boolean、Number、int、uint(它们都继承自Object),这些原生类型也被称为不变对象,它们共享单个对象的“引用”,并不共享“值”。

    Jun

    28

    实例成员与类成员可以重名,重名后实例成员会屏蔽类成员。类成员需要通过“类.成员”访问。

    Jun

    28

    函数闭包中的this总是指代全局对象[object global],所以当在嵌套函数中需要访问当前对象时,需要将this赋给一个变量。如:

    function m() {
     var currentObject = this;
     f();
     function f() {
      //这里允许访问currentObject
      //通过m()方法显示引用
      trace(currentObject);
     }
    }
    m();

    Jun

    27

    默认情况下,当编译一个 SWF 文件时,它会在第一帧中导出所有类,包括使用到的 所有直接类或间接类(如通过扩展或组件等)。这样当加载这个 SWF 文件时,只有在文档类所有被编译到 SWF 中的类全部加载后才会显示(在 init 事件发生之前)。为了避免这种类载入的延迟,需要使用 Flash 的延迟类的加载应用技术。即将除文档类和第 1 帧所必须的类之外的其它类延迟至 init 事件之后再加载,比如在第 2 帧或后续帧中加载。

    为了使用这种延迟加载的技术,我们需要用到以下几个步骤:

    ● 如在《Flash 库中的多个元件连接到单个超类》中所写的“作为一名高级的 AS 程序员来说,需要在基于 .fla 的发布设置中设置 AS3 的编译期行为,将“自动声明舞台实例”禁止(取消对勾)”。这是为了防止舞台上主时间轴中的命名实例相应的类在编译期自动添加到文档类中,这样就会被文档类间接的引用,并需要在init事件前就需要被加载。

    ● 将舞台上主时间轴上的所有手工创建的实例在对应的属性面板中需删除实例命名(如果主类中定义了相应的舞台上命名实例的变量,也同样需要删除——这是肯定的)。

    ● 在 FLA 文件发布设置的 AS3 设置选项中,修改“导出帧中的类”为大于 1 的帧或后续帧。

    使用延迟加载技术,可以在第一帧被加载后初始化界面,并使用一个优雅的加载进度条来显示当前文件的加载进度。

    Jun

    27

    Adobe 的编译器对 ActionScript 源文件(.as 文件)提出两个影响包层次函数的要求:

    ● 每个AS源文件必须有且仅一个外部可见定义。一个“外部可见定义”是一个类、变量、函数、包、或者命名空间,在一个包语句中定义为 internal 或 public。

    ● 一个 ActionScript 源文件的名字必须和那个唯一外部可见定义的名字相匹配。

    因此尽管理论上 ActionScript 对包层次函数没有提出任何限制,但实际上,Adobe 的编译器需要每个包层次函数在一个独立的 .as 文件中,要么定义为 internal,要么定义为 public,并具有匹配的文件名。

    More...

    Jun

    27

    在 Flash 的使用过程中,单个的类不能被  Flash 的库文件中的多个元件连接,所以需要作为一个超类(基类)来使用,元件本身需要扩展这个类,多个元件可以共享相同的超类行为。

    作为一名高级的 AS 程序员来说,需要在基于 .fla 的发布设置中设置 AS3 的编译期行为,将“自动声明舞台实例”禁止(取消对勾),如果元件的舞台上本身有手工创建的命名实例,那么需要在超类中显式的声明它们(并用以 public 修饰词)。这种显示声明的方式可以兼容多种开发环境,避免在其它的开发环境中编译期错误,如在 Flex 中。