About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Jul

    24

    让 JS 安全的运行在 AS 里

    • 1 Comments
    • Flash Platform

    什么时候都要记得真机调试,否则会死的很惨。先上一段代码:

    package
    {
        import flash.display.Sprite;
        import flash.events.LocationChangeEvent;
        import flash.media.StageWebView;
        //一个 AIR for iOS 的主类
        public class MainTest extends Sprite
        {
            private const view:StageWebView = new StageWebView(true);
            
            public function MainTest()
            {
                super();
                test();
            }

            private function test():void
            {
                view.addEventListener(LocationChangeEvent.LOCATION_CHANGING, locationChaningHandler);

                var xml1:XML = 
                    <script type="text/javascript">
                        var name = prompt("写点什么?","")//当运行的时候我们点击取消   
                        if(name)
                            alert("1:" + name);
                        else
                            alert("2:" + name);
                    </script>;

                view.loadString(xml1.toXMLString());
            }

            private function locationChaningHandler(e:LocationChangeEvent):void
            {
                //我们并不是为了跳转网页,所以这里中止跳转
                e.preventDefault();
            }
        }
    }

    在桌面 AIR 环境中测试,点击取消,输出"2:null",看起来一切良好。可是当连接上手机后,在真机测试环境中测试发现同样的操作结果输出了“1:null”。这和 JS 的自动转型规则完全不一样了,也就是这种 JS 代码运行在 AS 里面它显的那么的不安全。

    将上面的 XML 改为如下这个样子,让 JS 代码运行在一个函数里:

    var xml1:XML = 
        <script type="text/javascript">
            function run()
            &#x7B;
            var name = prompt("写点什么?","");                            
            if(name)
                alert("1:" + name);
            else
                alert("2:" + name);
            &#x7D;
            run();
        </script>;

    现在无论是在桌面上测试,还是在真机环境下,它们都保持输出一致了,都是“2:null”。其中 &#x7B; 与 &#x7D; 两个字符是在 E4X 里 XML 代表的左右大括号转字义符的实体字符。

    也可以将 JS 代码完全剥离 AS,使用一个纯文本文件,然后使用 Embed 标签嵌入。但这个方法对于纯 Flash IDE 开发人员并不适用,因为 Embed 标签需要 FLEX SDK 支持。

    JS 文件(因为是在纯文本文件中,所以左右大括号就不需要转义了;而且仍然要在函数中运行,否则它依然是不安全的,会和桌面测试环境不一致):

    <script type="text/javascript">
        function run()
        {
            var name = prompt("写点什么?","");                            
            if(name)
                alert("1:" + name);
            else
                alert("2:" + name);
        }
        run();
    </script>;

    然后 AS 代码也稍作修改:

    //这里必须写上 mimeType="application/octet-stream"
    [Embed(source="/assets/js/run.js", mimeType="application/octet-stream")]
    static private const JS:Class;

    static public const js:String = new JS();

    private var view:StageWebView = new StageWebView(true);

    private function test():void
    {
        view.addEventListener(LocationChangeEvent.LOCATION_CHANGING, locationChaningHandler);
        view.loadString(js);
    }

    备注:使用静态嵌入的 JS 文件会有两个缺点:1、不能动态的生成 JS 代码了。2、不能使用 AS 的特性了,比如 XML 的绑定语法之类的都不能用了。

    Mar

    20

    如果 AS 开发者认为 AS3 中只有通过关键字  new + 类的构造方法 才能创建对象,那就错了。AS3 仍然允许使用 new + 函数名(正式术语为“构造函数”) 创建动态对象,这里的函数名是指函数闭包的名称,可以是局部函数(内嵌函数)、也可以是全局函数,但不能是类的方法。

    通过 new + 函数名 创建对象是 AS1 中面向对象的方法(从 Flash5 & AS 1.1 版本开始的),并通过函数原型对象(prototype 属性引用该对象)来实现传统编程语言中的类继承,只是这种模拟的语法因为与传统业界的编程语言相差太大,并没有得到传统业界程序员的太多认可。

    下面附上一个样例代码:

    package
    {
        import flash.display.Sprite;

        public class AS1 extends Sprite
        {
            public function AS1()
            {
                //定义部份
                function A():void{
                    this.p2 = "p2a";
                }
                function B():void{
                    this.p2 = "p2b";
                }
                A.prototype.p1 = "p1";
                A.prototype.fun = function ():void{
                    trace("a_fun");
                }
                //测试部份
                var a:* = new A();//它们都是无类型的,所以用星号*表示,而不是函数名A
                var b:* = new B();

                trace(a,b);//[object Object] [object Object]
                trace(a.p1);//p1
                trace(a.p2);//p2a
                a.fun();//a_fun
                trace(b.p2);//p2b
            }
        }
    }

    事实上函数支持原型链之外, AS3 的类也支持原型链,在原型对象中定义方法,比如常用的 Object 类的 toString() 方法就在原型对象中定义,所以子类不能使用传统编程语言那样可以使用 override 修饰词去覆盖这个超级根类中的方法,子类直接编写属于自己的 toString() 方法,不需要 override 修饰词(如果写上 override 修饰词编译器反而会报错)。

    备注:在类的原型对象中定义方法时,如果是动态类,类似 Object 类这样可以直接使用点语法,但如果是一个静态类,使用点语法并不能通过编译器,因为静态类的属性或方法中并不存在原型对象中定义的内容,只有在运行期才能确定,所以要将点语法改为中括号 [ ] 访问原型对象中定义的内容。

    Aug

    23

    本文作者利用Git提交的元数据和Rapleaf API为流行的Github组织构建了一系列的统计数据(博客介绍具体数据),此外,他还对每门编程语言进行了统计,但作者希望统计能与现实接轨,他分别根据年龄、收入和性别来对每门编程语言进行划分。本文主要是统计每门编程的收入。

     
    统计方法

      ● 估算每个仓库的语言组成情况,例如,对某个项目进行评估,其中有75%的地方使用的是Java语言。

      ● 某个开源项目,如果有50%的地方使用了某门语言,然后统计所有做贡献开发者的总收入。

      ● 编程语言必须大于100个可用收入数据点。

    下面是每门语言的平均收入结果,由低到高排列:

     

    以图表形式显示,数据是一样的:

    大多数语言排名都比较符合我的预期,其中也有一些出乎意料的:

      ● Haskell是一门偏学术的语言,但学术界并不以高薪而闻名于世。

      ● PHP是一门非常易懂的语言,大多数人都可以上手。

      ● Java和ActionScript在企业软件中被普遍使用,所以他们在企业软件中的待遇肯定不菲。

    说明

      ●这些数据所使用的都是开源项目,所以它无法代表闭源项目开发者的收入情况。

      ●Rapleaf数据并没有覆盖范围,可能会存在偏差。

      ●对年龄、性别等其他方面没有进行纠正。

      ●没有抓取Github上的所有资料库,所以数据不具有代表性。

    此外,关于这份统计,在HN上引起了非常激烈的讨论,大家不妨去看看。

    英文来源:bpodgursky.wordpress

    More...

    Jun

    2

    Nov

    20

    本地共享存储 SharedObject 类默认路径:

    WINDOWS XP

    C:\Documents and Settings\计算机用户名\Application Data\Macromedia\Flash Player\#SharedObjects\随机文件名\localhost

     WINDOWS 7 

    C:\Users\计算机用户名\AppData\Roaming\Macromedia\Flash Player\#SharedObjects\随机文件名\localhost

     小心它有一个“陷井”:与普通文件名不一样的是,SharedObject 类 getLocal() 方法中name参数除不能使用 ~ % & \ ; : " ' , < > ? # 这些字符外,它还不能使用“空格”字符;但它可以合法的包含正斜杠 (/)。

    Nov

    18

     //删除头尾指定字符
    private function trimChar(theString:String, char:String):String {
    while (theString.charAt(0) == char) {
    theString = theString.substring(1, theString.length);
    }
    while (theString.charAt(theString.length-1) == char) {
    theString = theString.substring(0, theString.length-1);
    }
    return theString;
    }

    Oct

    11

    在 AS3 中当显示对象被分配鼠标事件时不再是全局的,比如拖动一个对象或画线时,如果鼠标指针移动的过快,并超出屏幕时,它是会意外中止的;再如当鼠标指针在显示对象外释放时无法侦听到 mouseUp 事件。

    对此,官方给出的建义是通过侦听 stage 的鼠标事件,就可以成为全局鼠标事件对象。如:

    stage.addEventListener(MouseEvent.MOUSE_MOVE, dragObject); 

    Fora global mouseMove event, assign listeners to the stage object. The stage object will always receive mouseMove events despite what other displayobjects the mouse is over (as long as the mouse moves within the Flash Player window). This way ifan object is being dragged,and the mouse moves off the object, the mouseMove event will still fire and the object will continue to follow the mouse.

    Aug

    25

    When you use lastChild or firstChild as the position value, the target value is interpreted as the container to which you want to add the child component(s). When you use a value of before or after for the position attribute, the target is interpreted as a sibling of the component(s) you are adding. If you want to add the child component(s) immediately before or after an existing component, you can specify the sibling component as the target and then use the value of before or after for the position attribute.

    More...

    Aug

    25

    When components are removed by changing states, the components are still stored in memory. Once a component has been created, moving away from the state in which it is created is the equivalent of calling the removeChild() method in ActionScript:the component is removed from the display list, but is still exists in memory.

    More...

    Aug

    17

    以下内容转自《programming flex 3》

    ActionScript also has the flash.utils.Dictionary class, which can be used in a similar fashion to Object. However, the keys for Dictionary are evaluated using strict equality for nonprimitive types, and objects used as keys must point to the same identity. In contrast, when using an Object as an associative array, the keys are tested using standard equality for nonprimitives, and objects used as keys can point to different identities as long as the toString() methods return the same value. Consider the following example.

    More...