J'ai une entrée de texte dans un div. En cliquant sur l'entrée, vous devez la mettre au point et arrêter le bouillonnement de l'événement div click. J'ai essayé les stopPropagation
et preventDefault
sur l'événement de saisie de texte mais en vain. Les journaux de la console montrent que le clic div s'exécute toujours malgré tout. Comment arrêter l'événement div click de s'exécuter?
// html
<div (click)="divClick()" >
<mat-card mat-ripple>
<mat-card-header>
<mat-card-title>
<div style="width: 100px">
<input #inputBox matInput (mousedown)="fireEvent($event)" max-width="12" />
</div>
</mat-card-title>
</mat-card-header>
</mat-card>
</div>
// component
@ViewChild('inputBox') inputBox: ElementRef;
divClick() {
console.log('click inside div');
}
fireEvent(e) {
this.inputBox.nativeElement.focus();
e.stopPropagation();
e.preventDefault();
console.log('click inside input');
return false;
}
Vous avez deux événements différents, l'un est mousedown
et l'autre est click
.
E.stopPropagation () ne fonctionne que si les deux événements sont du même type.
Vous pouvez modifier l'entrée comme celle-ci pour qu'elle fonctionne comme prévu:
<input #inputBox matInput (click)="fireEvent($event)" max-width="12" />
Exemple en direct: https://stackblitz.com/edit/angular-material-basic-stack-55598740?file=app/input -overview-example.ts
Vous ne pouvez arrêter la propagation que pour le même événement.
Votre fonction fireEvent
arrête la propagation de votre événement mousedown
, mais pas de votre événement click
.
Si vous voulez arrêter la propagation pour cliquer, essayez d'ajouter un autre événement de clic sur l'entrée et arrêtez la propagation à partir de là
Par exemple
<input #inputBox matInput (click)="$event.stopPropagation()" max-width="12" />
Votre autre fonction n'a besoin que de savoir ce qui est nécessaire, c'est-à-dire de définir le focus
fireEvent(e) {
this.inputBox.nativeElement.focus();
console.log('click inside input');
}
preventDefault()
empêche le comportement par défaut, il n'est pas lié au bouillonnement ou non aux événements, vous pouvez donc l'ignorer en toute sécurité