【问题标题】:How do I make a Stream of KeyboardEvent's that is triggered on long pressing the key ? (Dart)如何制作长按按键触发的键盘事件流? (镖)
【发布时间】:2016-01-11 06:21:57
【问题描述】:

如何创建一个在长按某个 html 元素中的键时触发的 KeyBoardEvent 流。

同样,我也对 Angular2 指令 (longpress) 感兴趣(想法相同)。

【问题讨论】:

    标签: stream dart angular


    【解决方案1】:
    @Directive(
        selector: '[longpress]')
    class LongPress {
      @Output() EventEmitter<KeyboardEvent> longpress =
          new EventEmitter<KeyboardEvent>();
    
      KeyboardEvent _startEvent;
      @Input() Duration longpressDelay = new Duration(seconds: 2);
      Timer timer;
    
      @HostListener("keydown", const [r"$event"])
      @HostListener("keyup", const [r"$event"])
      void keyEventHandler(KeyboardEvent event) {
        if (_startEvent == null ||
            _startEvent.type != event.type ||
            _startEvent.keyCode != event.keyCode) {
          if (timer != null) {
            timer.cancel();
          }
          _startEvent = event;
    
          if(event.type == 'keyup') {
            timer = new Timer(longpressDelay, () {
              longpress.add(_startEvent);
              timer = null;
            });
          }
        }
      }
    }
    

    并像使用它

    <label for="input">Longpress: </label><input id="longpress" longpress (longpress)="longPressed($event)">
    

    我还没有弄清楚如何让指令选择器与(...) 一起工作,所以这也可以:

    <label for="input">Longpress: </label><input id="longpress" (longpress)="longPressed($event)">
    

    事件处理 (preventDefault) 似乎还不能正常工作。 将此指令添加到 &lt;input&gt; 会中断输入中的写入。

    一种解决方法是改为以这种方式订阅 keydown/keyup

    LongPress(ElementRef elementRef) {
      (elementRef.nativeElement as Element).onKeyDown.listen(keyEventHandler);
      (elementRef.nativeElement as Element).onKeyUp.listen(keyEventHandler);
    }
    

    【讨论】:

      【解决方案2】:

      以下是打字稿版本,如果有人感兴趣:

      import { Directive, EventEmitter, Output, Input, HostListener } from '@angular/core';
      
          @Directive({
              selector: '[longpress]'
          })
          export class LongPressDirective {
      
            @Output() longpress: EventEmitter<KeyboardEvent> = new EventEmitter(true);
      
            _startEvent: KeyboardEvent;
            @Input() longpressDelay: number = 1000;
      
            timer: any;
      
            @HostListener('keydown', ['$event'])
            @HostListener('keyup', ['$event'])
            keyEventHandler(event: KeyboardEvent) {
              if (this._startEvent == null ||
                this._startEvent.type != event.type ||
                this._startEvent.keyCode != event.keyCode) {
      
                //console.log(event.type, event);
                if (this.timer != null) {
                  clearTimeout(this.timer);
                }
      
                this._startEvent = event;
      
                if(event.type == 'keydown') {
                  this.timer = setTimeout(() => {
                    console.log('longpress');
                    this.longpress.emit(this._startEvent);
                    clearTimeout(this.timer);
                    this.timer = null;
                  }, this.longpressDelay);
                }
              }
            }
          }
      

      【讨论】:

      猜你喜欢
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      相关资源
      最近更新 更多