es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo evitar la propagación de enlaces de teclas dentro del componente ng-bootstrap ngbModal?

Para mantener la página en cumplimiento con la ADA, necesitamos poder abrir la ventana emergente modal de ng-bootstrap (ngbModal) haciendo clic/espacio/enter en el botón “ABRIR”.

<div (keyup.enter)="openModal($event)" (keyup.space)="openModal($event) (click)="openModal($event)">Abrir Modal</div> 

Dentro de la página de la ventana modal:

<button>Cerrar</button>

Presionar enter en el botón de cerrar cierra la ventana modal, regresa al elemento div que la llamó y vuelve a ejecutar la tecla ENTER y vuelve a abrir la ventana modal. He intentado stoppropagation, return false, cancelbubble dentro de la función openModal y dentro de la modal misma sin éxito, la tecla ENTER vinculada sigue subiendo/bajando las dos páginas.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para resolver este problema, puede agregar un oyente de eventos keydown en el botón de cierre dentro de la página modal y detener la propagación del evento usando event.stopPropagation().

    Aquí hay un ejemplo del fragmento de código:

    // Llamando al elemento div
    <div (keyup.enter)="openModal($event)" (keyup.space)="openModal($event)" (click)="openModal($event)">Abrir Modal</div>
    
    // Página modal
    <ng-template #content="" let-modal="">
      <button (keydown)="onCloseKeyDown($event)">Cerrar</button>
    </ng-template>
    
    // Código del componente
    export class MyComponent {
      constructor(private modalService: NgbModal) {}
    
      openModal(event: any) {
        this.modalService.open(this.content);
        event.stopPropagation();
      }
    
      onCloseKeyDown(event: KeyboardEvent) {
        if (event.key === 'Enter') {
          event.stopPropagation();
          this.modalService.dismissAll();
        }
      }
    }
    

    En este código, hemos agregado un oyente de eventos keydown en el botón de cierre dentro de la página modal y hemos llamado a la función onCloseKeyDown() cuando se presiona una tecla. Dentro de esta función, hemos verificado si la tecla presionada es Enter y, si es así, hemos detenido la propagación del evento usando event.stopPropagation() y descartado el modal usando this.modalService.dismissAll(). Esto evita que el evento se propague hacia arriba / hacia abajo en las dos páginas y vuelva a abrir el modal.

Comments are closed.