Cronologia delle finestre di dialogo JavaScript
JavaScript è stato introdotto nel 1995 e, nella prima versione di JavaScript, erano presenti metodi sull'oggetto finestra denominato alert()
, confirm()
e prompt()
.
Sebbene si adattino al codice JavaScript dell'epoca, la loro API sincrona è problematica per i browser moderni. Poiché il motore JavaScript deve mettere in pausa finché non si ottiene una risposta dell'utente, le finestre di dialogo JavaScript sono di tipo app-modal. Inoltre, poiché le finestre di dialogo sono modali per l'app, vengono comunemente (e sfortunatamente) utilizzate per danno i nostri utenti.
Per questo motivo, il team di Chromium consiglia vivamente di non utilizzare finestre di dialogo JavaScript.
Alternative
Esistono molte opzioni per la sostituzione delle finestre di dialogo.
Ci sono diverse opzioni per alert()/confirm()/prompt()
. Per notificare all'utente eventi (ad es. siti di calendario), utilizza l'API Notifications. Per ottenere l'input dell'utente, deve essere utilizzato
l'elemento <dialog>
HTML. Per i proof of concept XSS, è possibile utilizzare console.log(document.origin)
di devtool.
Per quanto riguarda onbeforeunload
, occorre tenere presente che è già inaffidabile. Come sottolinea Ilya Grigorik, "non è possibile fare affidamento sugli eventi pagehide
, beforeunload
e unload
per essere attivati sulle piattaforme mobile. Se hai bisogno di salvare lo stato, devi utilizzare l'API Page Visibility.
Modifiche
La possibilità di una pagina di specificare la stringa onbeforeunload
è stata
rimossa in Chrome 51.
(è stato rimosso anche da Safari a partire da Safari 9.1 e in Firefox 4).
alert()/confirm()/prompt()
finestre di dialogo sono cambiate da modali dell'app a chiusi quando la scheda viene cambiata da. Questo
cambiamento è stato applicato a tutti i canali all'inizio di maggio 2017.
Le finestre di dialogo beforeunload
richiedono un gesto dell'utente sulla pagina per poter visualizzare
a partire da Chrome 60.
Questa operazione non modifica l'esecuzione dell'evento beforeunload
. Questo allinea
Chromium con Firefox, che ha apportato questa modifica con Firefox 44.
La visualizzazione di una finestra di dialogo alert()/confirm()/prompt()
a schermo intero causerà la perdita della modalità a schermo intero a partire da Chrome 61.
prompt()
finestre di dialogo non attivano la scheda. Se prompt()
viene chiamato da una scheda in background, la chiamata torna immediatamente e non viene visualizzata alcuna finestra di dialogo.
Questo cambiamento
è stato applicato a tutti i canali all'inizio di maggio 2017.
alert()
finestre di dialogo non attivano la scheda. Se alert()
viene richiamata da una
scheda in background, la chiamata viene restituita immediatamente. La scheda è contrassegnata da un indicatore
e l'utente vedrà la finestra di dialogo quando passa alla scheda. Questo cambiamento del comportamento
è visibile
a partire da Chrome 64.
confirm()
finestre di dialogo non attivano la scheda. Se confirm()
viene chiamato da una scheda in background, la chiamata torna immediatamente e non viene visualizzata alcuna finestra di dialogo.
Questo cambiamento del comportamento è visibile a partire da Chrome 69.
A causa di questi cambiamenti, se il tuo sito utilizza le finestre di dialogo, ti consigliamo vivamente di passare alle alternative menzionate in precedenza, in modo da non subire conseguenze.