Javascript键控事件不存在´;Don’别把边上的字符给我
我在一个指令中工作,基本上当用户在输入字段中键入时(在本例中是一个div,其Javascript键控事件不存在´;Don’别把边上的字符给我,javascript,angular,typescript,Javascript,Angular,Typescript,我在一个指令中工作,基本上当用户在输入字段中键入时(在本例中是一个div,其contentEditable=true),将显示一个用户列表,然后以特定格式插入用户的名称,现在在用户按@后将显示该列表,对于chrome和firefox来说效果很好,但是对于EDGE和IE(不幸的是我需要支持)来说效果不好,因为在这种情况下,@显然不存在 现在,对于按键,我使用的是@HostListener('keydown',['$event']) 主机侦听器 @HostListener('keydown',
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);
}
......
并且应该能够提供一些提示。非常感谢我在第一个链接中找到了解决方案太棒了!也许写一个简短的自我回答,然后解释是什么解决了这个问题;-)并且应该能够提供一些提示。非常感谢我在第一个链接中找到了解决方案太棒了!也许写一个简短的自我回答,然后解释是什么解决了这个问题;-)