Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript键控事件不存在´;Don’别把边上的字符给我_Javascript_Angular_Typescript - Fatal编程技术网

Javascript键控事件不存在´;Don’别把边上的字符给我

Javascript键控事件不存在´;Don’别把边上的字符给我,javascript,angular,typescript,Javascript,Angular,Typescript,我在一个指令中工作,基本上当用户在输入字段中键入时(在本例中是一个div,其contentEditable=true),将显示一个用户列表,然后以特定格式插入用户的名称,现在在用户按@后将显示该列表,对于chrome和firefox来说效果很好,但是对于EDGE和IE(不幸的是我需要支持)来说效果不好,因为在这种情况下,@显然不存在 现在,对于按键,我使用的是@HostListener('keydown',['$event']) 主机侦听器 @HostListener('keydown',

我在一个指令中工作,基本上当用户在输入字段中键入时(在本例中是一个div,其
contentEditable=true
),将显示一个用户列表,然后以特定格式插入用户的名称,现在在用户按
@
后将显示该列表,对于chrome和firefox来说效果很好,但是对于EDGE和IE(不幸的是我需要支持)来说效果不好,因为在这种情况下,
@
显然不存在

现在,对于按键,我使用的是
@HostListener('keydown',['$event'])

主机侦听器

  @HostListener('keydown', ['$event']) keyHandler(event: any, nativeElement: HTMLInputElement = this._element.nativeElement) {
    let val: string = getValue(nativeElement);
    let pos = getCaretPosition(nativeElement, this.iframe);
    let charPressed = this.keyCodeSpecified ? event.keyCode : event.key;
    if (!charPressed) {
      let charCode = event.which || event.keyCode;
      if (!event.shiftKey && (charCode >= 65 && charCode <= 90)) {
        charPressed = String.fromCharCode(charCode + 32);
      } else if (event.shiftKey && charCode === KEY_2) {
        charPressed = this.triggerChar;
      } else {
        charPressed = String.fromCharCode(event.which || event.keyCode);
      }
    }
    if (event.keyCode == KEY_ENTER && event.wasClick && pos < this.startPos) {
      // put caret back in position prior to contenteditable menu click
      pos = this.startNode.length;
      setCaretPosition(this.startNode, pos, this.iframe);
    }
    // console.log('=== keyHandler', this.startPos, pos, val, charPressed, event);
    this.triggerList(event, charPressed, nativeElement, val, pos);
  }

现在的问题是,如果要插入字符的用户
@
需要使用
ALT+Q
EDGE的组合,则只需检测
ALT
,然后再检测
Q
,与firefox和chrome相比,使用ALT+Q组合时,由于这个原因,列表不会显示,因为字符永远不匹配。

首先,我将
按键
的事件替换为
按键
,然后,在变量
charPress
中保存字符的地方,我创建了一个条件来检查浏览器是EDGE还是IE,并使用
event.charCode
获取字符代码,然后使用
string将其转换为string。fromCharCode(event.charCode)
结尾处如下图所示

  @HostListener('keypress', ['$event']) keyHandler(event: any, nativeElement: HTMLInputElement = this._element.nativeElement) {
    let val: string = getValue(nativeElement);
    let pos = getCaretPosition(nativeElement, this.iframe);
    let charPressed = this.keyCodeSpecified ? event.keyCode : event.key;
    if (this.configService.appConfig.platform.EDGE) {
      charPressed = String.fromCharCode(event.charCode);
    }
    ......

首先,我为
keypress
替换事件
keydown
,然后在变量
charPress
中保存字符的地方,我创建一个条件来检查浏览器是EDGE还是IE,并使用
event.charCode
获取字符代码,并使用
string.fromCharCode(event.charCode)将其转换为字符串
结尾看起来像这样

  @HostListener('keypress', ['$event']) keyHandler(event: any, nativeElement: HTMLInputElement = this._element.nativeElement) {
    let val: string = getValue(nativeElement);
    let pos = getCaretPosition(nativeElement, this.iframe);
    let charPressed = this.keyCodeSpecified ? event.keyCode : event.key;
    if (this.configService.appConfig.platform.EDGE) {
      charPressed = String.fromCharCode(event.charCode);
    }
    ......

并且应该能够提供一些提示。非常感谢我在第一个链接中找到了解决方案太棒了!也许写一个简短的自我回答,然后解释是什么解决了这个问题;-)并且应该能够提供一些提示。非常感谢我在第一个链接中找到了解决方案太棒了!也许写一个简短的自我回答,然后解释是什么解决了这个问题;-)