zoukankan      html  css  js  c++  java
  • [转]关于event的两个常被忽略的api:isDefaultPrevented()和preventDefault()

    今天在robert penner(as3 singal的作者)的一篇blog文中顺藤摸瓜到了darron schall的另外一篇blog文(Creating Default, Cancelable Event Handlers),仔细看了一下,忽然有种相见恨晚的感觉。

     
    确实是啊~rober penner的singal我不是第一天就知道了,之后再arpg的demo里面也有用过,只可惜今天才认真看了一下penner的这篇文章,也很可惜在schall发布这个文章的两年后才看到,真遗憾
     
    好了,下面来谈谈这两个api的官方documentation描述:
     
    preventDefault

    public function preventDefault():void

    如果可以取消事件的默认行为,则取消该行为。

    许多事件都有默认执行的关联行为。例如,如果用户在文本字段中键入一个字符,则默认行为就是在文本字段中显示该字符。 由于可以取消 TextEvent.TEXT_INPUT 事件的默认行为,因此您可以使用 preventDefault() 方法来防止显示该字符。

    不可取消行为的一个示例是与 Event.REMOVED 事件关联的默认行为,只要 Flash Player 从显示列表中删除显示对象,就会生成该事件。 由于无法取消默认行为(删除元素),因此 preventDefault() 方法对此默认行为无效。

    您可以使用 Event.cancelable 属性来检查是否可以防止与特定事件关联的默认行为。 如果 Event.cancelable 的值为 true,则可以使用 preventDefault() 来取消事件;否则,preventDefault() 无效。

    另请参见

     
    isDefaultPrevented () 方法  

    public function isDefaultPrevented():Boolean

    检查是否已对事件调用 preventDefault() 方法。如果已调用 preventDefault() 方法,则返回 true;否则返回 false

    另请参见

     
    关于api的作用我解析不够权威,所以粘贴了官方文档,而我对schall的文章例子也不是非常感兴趣,所以我举一个我以前用到的实战例子,怎么实现文本输入限制字数的功能
     
    当然,as3 api的textfeidl提供了一个maxChars的api,不过这个中看不中用大家也知道的~
     
    以前我的实现方法是
    监听textfield的TextEvent.TEXT_INPUT事件和Event.CHANGE事件:
    input事件触发时,判断一下当前是否合法(超出长度),没有超出长度则保存一个合法的字符串
    change事件触发时,判断一下新的字符是否合法,不合法的话,替换回原来保存的合法字符串
    如下:
    private function init():void {
       _inputTf = new TextField();
       _inputTf.width = 100;
       _inputTf.border = true
       _inputTf.type = TextFieldType.INPUT;
    
       _inputTf.addEventListener(TextEvent.TEXT_INPUT, onTextInput);
       _inputTf.addEventListener(Event.CHANGE, onChange);
    
       this.addChild(_inputTf);
      }
    
      private function onTextInput(event:TextEvent):void {
       if (StringUtils.checkStringNum(_inputTf.text) <= 6) {
        _tempStr = _inputTf.text;
       }
      }
    
      private function onChange(event:Event):void {
       var curNum:int = StringUtils.checkStringNum(_inputTf.text);
       if (curNum > 6) {
        _inputTf.text = _tempStr;
       }
      }

    现在发现textinput这个事件的cancelable是为true的,则表明可以通过preventDefault来取消默认行为(textfield的默认行为是显示文字),于是,新的处理方法为:

     1 private function init():void {
     2    _inputTf = new TextField();
     3    _inputTf.width = 100;
     4    _inputTf.border = true
     5    _inputTf.type = TextFieldType.INPUT;
     6 
     7    _inputTf.addEventListener(TextEvent.TEXT_INPUT, onTextInput2);
     8 
     9    this.addChild(_inputTf);
    10   }
    11 
    12   private function onTextInput2(event:TextEvent):void {
    13    if (StringUtils.checkStringNum(_inputTf.text + event.text) > 6) {
    14     event.preventDefault();
    15     //这里也可以添加一些截取文本的逻辑,例如拷贝进来10个字符,截掉其中的6个
    16    }
    17   }
    现在就一个事件处理器就能解决,而且StringUtils.checkStringNum方法也少调用一次了,非常不错~
     
    btw:关于isDefaultPrevented ()这个api的使用,可以看schall的例子,多数用于我们自定义自己默认的事件行为的实现上有应用到,而且发出来的事件也要把cancelable设置为true
     
     
    扩展一下:
     
    1.EventDispatcher.dispatchEvent()这个api是有个Boolean的返回值的
    返回
      Boolean — 如果成功调度了事件,则值为 true。 值 false 表示失败或对事件调用了 preventDefault()。 
    这篇文章的应用思想不错,check it out
     
    2.常用的可以取消的事件有(cancelable为true):
    FocusEvent.MOUSE_FOCUS_CHANGE
    FocusEvent.KEY_FOCUS_CHANGE
    TextEvent.TEXT_INPUT
  • 相关阅读:
    第01组 Alpha冲刺(4/6)
    第01组 Alpha冲刺(3/6)
    第01组 Alpha冲刺(2/6)
    第01组 Alpha冲刺(1/6)
    第01组 团队Git现场编程实战
    第01组 团队项目-需求分析报告
    团队项目-选题报告
    团队作业-选题报告
    第二次结对编程作业
    第09组 Alpha冲刺(5/6)
  • 原文地址:https://www.cnblogs.com/leoin2012/p/4093284.html
Copyright © 2011-2022 走看看