Angular - событие фокуса вызывается при потере фокуса - PullRequest
0 голосов
/ 21 января 2019

Я столкнулся с какой-то ошибкой, которую я считаю с angular и chrome, и я не совсем уверен, в чем заключается решение, мое угловое приложение имеет пользовательские элементы управления вводом, и эти входы делают некоторые вещи в фокусе (focus)="someEvent($event). Эти входные данные являются полями имени пользователя и пароля, поэтому Chrome хранит значения. При повторной загрузке страницы Chrome будет применять сохраненные значения, если пользователь щелкает в другом месте экрана (НЕ на компонентах ввода), оба компонента ввода запускают событие focus.

Я мог бы понять, произошло ли это при загрузке страницы, поскольку Chrome может циклически переключаться между входами и применять сохраненные значения, однако это происходит после первого щелчка мышью в любом месте страницы.

Есть ли способ интерпретировать, что эти события фокусировки были вызваны функцией автозаполнения, а не фокусировкой пользователя на вводе вручную?

У меня есть некоторый код для этих событий, который делает event.target.select(), чтобы выделить весь текст, и, как ни странно, 2 входа заканчивают тем, что застревали в цикле фокусировки. Первый фокусируется, затем второй, затем первый, затем второй навсегда, пока пользователь не нажмет клавишу Tab.

HTML:

<input [ngClass]="inputClass" [type]="this.type" [readOnly]="this.readonly || (this.ParentPanel && this.ParentPanel.readonly)" [ngStyle]="inputStyle" [disabled]="disabled || (this.ParentPanel && this.ParentPanel.disabled)" [(ngModel)]="value" (change)="Event_change($event)" (keyup)="Event_keyup($event)" (keydown)="Event_keydown($event)" (focus)="Event_focus($event)" maxlength="512"/>

TS:

Event_focus(event) {
    console.log('focus event' , event);
    if (this.selectAllOnFocus) {
      setTimeout(() => { // required to work with Edge (OnFocus happens before some browser properties are set)
        event.target.select();
      });
    }
    this.OnFocus.emit(event);
  }

Спасибо.

1 Ответ

0 голосов
/ 21 января 2019

Я понял это, прежде чем код будет вызван - я должен проверить, является ли элемент управления документами activeElement.

if (this.selectAllOnFocus && this.element && this.element.nativeElement === document.activeElement) { //do rest here }

Похоже, это работает и решает мою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...