Necesito mostrar una página web en la vista web y hacer que ocurran ciertas navegaciones. Dado que la vista web no permite que pasen los diálogos de confirmación, quiero escuchar los eventos de diálogo en la vista web y luego pasar mi propio diálogo personalizado y hacer que la acción del usuario sea la que se tomará.
Escuchar la vista web del evento es bastante fácil:
webview.addEventListener('dialog', this.onDialogOpen);Y luego abro el diálogo con dicho método:
private onDialogOpen (e: any): void { this.dialogOn = true; this.dialogEvent = e; }Ahora lo que quiero es que el usuario interactúe con mi diálogo y pase su acción a este evento de diálogo, así:
<button onclick="onDialogAction()">OK</button>Y ejecuta el script:
public onDialogAction() { this.dialogEvent.dialog.ok(); }Pero en este punto me sale el error en el título:
webview: ya se ha realizado una acción para este evento de "diálogo".
Según tengo entendido, por alguna razón, el DialogEvent se 'obsoleta' una vez que ha pasado un tiempo. Si digo 'this.dialogEvent.dialog.ok();' dentro de onDialogOpen funciona. También puedo llamar a 'this.dialogEvent.dialog.ok();' desde cualquier otro método si lo llamo desde onDialogOpen. Sin embargo, si digo setTimeout dentro de onDialogOpen, deja de funcionar nuevamente.
¿Cuál sería la causa de esto y cuál sería la forma correcta de evitarlo?
La solución fue simple para cualquiera que llegara a esta pregunta desde una búsqueda:
Simplemente agregando
this.dialogEvent.preventDefault();a onDialogOpen() hace el truco. El problema era que la acción predeterminada para cualquier evento de diálogo era cancelar, y eso se activa por algún motivo cuando se carga el DOM. Pero se puede evitar que cualquier evento de diálogo se vuelva predeterminado con preventDefault() aparentemente.