代码之家  ›  专栏  ›  技术社区  ›  rinogo

是否可以通过dispatchEvent()操纵UI元素?

  •  0
  • rinogo  · 技术社区  · 14 年前

    我写了一个测试来试验这种现象:

    package sandbox {
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.text.TextField;
    import flash.text.TextFieldType;
    import flash.text.TextFieldAutoSize;
    import flash.utils.setTimeout;
    
    
    
        public class Test extends Sprite {
            private var tf:TextField;
            private var tf2:TextField;
    
            public function Test() {
                super();
    
                tf = new TextField();
                tf.text = 'Interact here';
                tf.type = TextFieldType.INPUT;
                addChild(tf);
    
                tf2 = new TextField();
                tf2.text = 'Same events replayed with five second delay here';
                tf2.autoSize = TextFieldAutoSize.LEFT;
                tf2.type = TextFieldType.INPUT;
                tf2.y = 30;
                addChild(tf2);
    
                tf.addEventListener(MouseEvent.CLICK, mouseListener);
                tf.addEventListener(MouseEvent.DOUBLE_CLICK, mouseListener);
                tf.addEventListener(MouseEvent.MOUSE_DOWN, mouseListener);
                tf.addEventListener(MouseEvent.MOUSE_MOVE, mouseListener);
                tf.addEventListener(MouseEvent.MOUSE_OUT, mouseListener);
                tf.addEventListener(MouseEvent.MOUSE_OVER, mouseListener);
                tf.addEventListener(MouseEvent.MOUSE_UP, mouseListener);
                tf.addEventListener(MouseEvent.MOUSE_WHEEL, mouseListener);
                tf.addEventListener(MouseEvent.ROLL_OUT, mouseListener);
                tf.addEventListener(MouseEvent.ROLL_OVER, mouseListener);
            }
    
    
            private function mouseListener(event:MouseEvent):void {
                //trace(event);
                setTimeout(function():void {trace(event); tf2.dispatchEvent(event);}, 5000);
            }
        }
    }
    

    本质上,此测试所做的一切就是使用setTimeout在TextField tf上有效地“记录”事件,并在五秒钟后在TextField tf上重放它们。在tf2上调度事件时,会跟踪到控制台输出。运行此程序并单击tf时的控制台输出为:

    [MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=0 localY=1 stageX=0 stageY=1 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
    [MouseEvent type="rollOver" bubbles=false cancelable=false eventPhase=2 localX=0 localY=1 stageX=0 stageY=1 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
    [MouseEvent type="mouseOver" bubbles=true cancelable=false eventPhase=3 localX=0 localY=1 stageX=0 stageY=1 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
    [MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=2 localY=1 stageX=2 stageY=1 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
    [MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=2 localY=2 stageX=2 stageY=2 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
    [MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=2 localY=3 stageX=2 stageY=3 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
    [MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=3 localY=3 stageX=3 stageY=3 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
    [MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=5 localY=3 stageX=5 stageY=3 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
    [MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=6 localY=5 stageX=6 stageY=5 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
    [MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=7 localY=5 stageX=7 stageY=5 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
    [MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=9 localY=5 stageX=9 stageY=5 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
    [MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=10 localY=5 stageX=10 stageY=5 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
    [MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=11 localY=5 stageX=11 stageY=5 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
    [MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=12 localY=5 stageX=12 stageY=5 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
    [MouseEvent type="mouseDown" bubbles=true cancelable=false eventPhase=3 localX=12 localY=5 stageX=12 stageY=5 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
    [MouseEvent type="mouseUp" bubbles=true cancelable=false eventPhase=3 localX=12 localY=5 stageX=12 stageY=5 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
    [MouseEvent type="click" bubbles=true cancelable=false eventPhase=3 localX=12 localY=5 stageX=12 stageY=5 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
    [MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=10 localY=4 stageX=10 stageY=4 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
    [MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=9 localY=2 stageX=9 stageY=2 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
    [MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=9 localY=1 stageX=9 stageY=1 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
    [MouseEvent type="mouseOut" bubbles=true cancelable=false eventPhase=3 localX=-1 localY=-1 stageX=-1 stageY=-1 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
    [MouseEvent type="rollOut" bubbles=false cancelable=false eventPhase=2 localX=-1 localY=-1 stageX=-1 stageY=-1 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
    

    正如我们所看到的,这些事件被成功地捕捉和回放。但是,在tf2中没有发生任何更改-鼠标光标没有像我们预期的那样出现在tf2中。事实上,即使在调度了tf2事件之后,游标仍保留在tf中。

    谢谢, -富有的

    1 回复  |  直到 14 年前
        1
  •  1
  •   krichard    14 年前

    你有点倒退了。当你点击一个对象,它发送一个MouseEvent,它基本上告诉世界“嘿,我被点击了”。此事件是单击的结果。仅仅调度对象上的事件实际上并不会导致对象被单击(尽管如果其他对象正在侦听对象上的事件,调度事件会导致它们被单击) 认为

    编辑:

    重读你原来的帖子,我看到你说你想把光标放在一个特定的x,y坐标上。我想您可能想看看TextField.getLineIndexAtPoint()、TextField.getCharIndexAtPoint()和TextField.setSelection()