事件“selectstart”在“input”字段上不起作用

Event `selectstart` is not working on `input` field

提问人:janci 提问时间:10/6/2023 最后编辑:janci 更新时间:10/6/2023 访问量:78

问:

我对角度指令有疑问。我在stackblitz Project上准备了一个简单的项目。 基本上,我注意到HTML控件接收事件但从不接收事件。 同样,控件接收事件,但从不接收事件。 您可以通过查看我的调试日志输出或在调试器中设置断点来检查它。inputselectselectstartlabelselectstartselect

这是设计使然还是角度上的错误?

(仅包含事件处理程序)并如下所示:Directivehtml template

指令

import { Directive, ElementRef, HostListener, Renderer2 } from '@angular/core';


@Directive({
  selector: '[appDateInput]',
  })

export class DateInputDirective {
  constructor(private el: ElementRef, private renderer: Renderer2) {
    console.log("S:" + this.el.nativeElement.selectionStart
      + " E:" + this.el.nativeElement.selectionEnd
    );
  }

  @HostListener('selectstart', ['$event'])
  onSelectStart(event: KeyboardEvent): void {
    //event.preventDefault();
    console.log("onSelectStart called");
    console.log("S:" + this.el.nativeElement.selectionStart
      + " E:" + this.el.nativeElement.selectionEnd
    );
  }
  @HostListener('select', ['$event'])
  onSelect(event: KeyboardEvent): void {
    //event.preventDefault();
    console.log("onSelect called");
    console.log("S:" + this.el.nativeElement.selectionStart
      + " E:" + this.el.nativeElement.selectionEnd
    );
  }
  @HostListener('selectionchange', ['$event'])
  onSelectionChange(event: KeyboardEvent): void {
    //event.preventDefault();
    console.log("onSelectionChange called");
    console.log("S:" + this.el.nativeElement.selectionStart
      + " E:" + this.el.nativeElement.selectionEnd
    );
  }
}

HTML 模板:

<label appDateInput>Selection test</label>

<form>
  <label for="fname">First name:</label>
  <input type="text" id="fname" name="fname" appDateInput><br><br>
</form>
JavaScript HTML Angular 事件

评论

0赞 Chris Barr 10/6/2023
直接在您的问题中放置一个最小可重复示例。不要只是将我们指向链接到另一个网站的代码。该网站上的代码可能会随着时间的推移而更改或消失,从而将问题留给未来的读者,而没有任何上下文。当您需要帮助的代码实际上在问题中时,您的问题变得更容易回答。请编辑您的问题,然后单击工具栏中的按钮,该按钮看起来像是为您的问题添加代码片段[<>]

答:

1赞 Kaiido #1

这是意料之中的,selectstart 属于 Selection API,它涉及“通常”的 DOM 节点,而 select 仅适用于输入表单元素 (, )。不幸的是,它们是独立且相互排斥的 API。<input><textarea>

评论

0赞 janci 10/6/2023
谢谢你的回答。我尝试使用 in 元素来禁用选择(只是我的要求) - 所以这行不通,不是吗?selectstartinput
0赞 Kaiido 10/6/2023
这将是它自己的问题,但不是你想要的问题,而是尝试哪个,因为在Firefox之外的其他地方没有很好的支持输入,所以我们需要一些恶作剧来做你想做的事(如果我理解正确的话):jsfiddle.net/yrd8stebselectstartselectionchange
0赞 Afzal K. 10/6/2023
@janci尝试使用指针事件 none
0赞 Afzal K. 10/6/2023
或使用指令将输入值绑定到组件中的变量ngModel
1赞 janci 10/6/2023
@Kaiido 是的。它的工作方式与你一样 - 我已附加到文档中。我的解决方案现在是位混合 - 一些实现是在 angular 指令中完成的,一些位是在组件本身中完成的 - 但它有效。谢谢。selectionchange