Jul*_*tte 4 javascript events focus blur angular
我有以下用例:
有一个input
,应该旁边时,它具有焦点的输入来显示弹出。因此,当input
具有焦点时,用户可以输入input
或使用弹出窗口来选择某些内容。
用户完成后,他可以通过单击其他位置或按 Tab 键并聚焦下一个元素来取消对元素的聚焦。但是,如果他单击弹出窗口内的按钮,弹出窗口应保持打开状态,输入应保持聚焦,以便用户可以继续键入。
我遇到的问题是,(click)
在弹出窗口中处理输入之前,角度处理(模糊)。这意味着当用户在弹出窗口中点击时,输入失去焦点,它被隐藏,然后用户的点击将不再被处理。
我为这个问题制作了一个stackblitz-demo:
这是源代码:
应用程序组件.html
<h1>Hello</h1>
<p>
Type 'one', 'two' or 'three' to change number or select a number
from popup.
<br>
<input type="checkbox" [(ngModel)]="hideHelperOnBlur" /> Hide
helper on blur (if this is set, then the buttons in the popup don't work
but if this is not set, the popup doesn't close if the input looses
focus -> how can I get both? The buttons to work but the popup still
closing on blur?)
</p>
Your number: {{selectedNumber}}
<p>
Change number:
<input [ngModel]="formattedNumber" (ngModelChange)="newNumberTyped($event)" (focus)="helperVisible = true"
(blur)="processBlur()" #mainInput />
<div *ngIf="helperVisible">
<button *ngFor="let number of numbers" (click)="selectNumber(number.raw)">{{number.formatted}} </button>
</div>
Run Code Online (Sandbox Code Playgroud)
app.component.ts
import { Component, ViewChild, ElementRef } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
name = 'Angular';
formattedNumber: string = 'three';
selectedNumber: number = 3;
helperVisible: boolean = false;
numbers: any[] = [
{ raw: 1, formatted: 'one' },
{ raw: 2, formatted: 'two' },
{ raw: 3, formatted: 'three' }
];
@ViewChild('mainInput', { static: false })
mainInput: ElementRef;
hideHelperOnBlur: boolean;
newNumberTyped(newFormattedNumber: string) {
this.numbers.forEach((number) => {
if (newFormattedNumber == number.formatted) {
this.formattedNumber = newFormattedNumber;
this.selectedNumber = number.raw;
}
});
}
selectNumber(newRawNumber: number) {
this.numbers.forEach((number) => {
if (newRawNumber == number.raw) {
this.formattedNumber = number.formatted;
this.selectedNumber = newRawNumber;
}
});
this.mainInput.nativeElement.focus();
}
processBlur() {
if (this.hideHelperOnBlur) {
this.helperVisible = false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我期望以下行为:
我似乎只能让第二个和第三个或第四个标准起作用(请参阅演示中的复选框)。
我已经尝试过的:
有没有人有办法解决吗?
nas*_*h11 10
这更像是一个 Javascript 的东西。该blur
事件发生之前click
的事件。该click
事件仅在释放鼠标按钮后发生。
您可以充分利用mousedown
此处的活动。该mousedown
事件发生之前blur
的事件。只需调用preventDefault
上mousedown
的酥料饼按钮,以防止input
失去焦点。在您这也将解决这一问题input
闪烁,当您单击按钮酥料饼的,所以你可以摆脱this.mainInput.nativeElement.focus();
你的selectNumber
功能。
<button *ngFor="let number of numbers" (mousedown)="$event.preventDefault()" (click)="selectNumber(number.raw)">{{number.formatted}}</button>
Run Code Online (Sandbox Code Playgroud)
这是StackBlitz上的一个工作示例。