Geschiedenis van JavaScript-dialogen
JavaScript werd geïntroduceerd in 1995 en in de allereerste versie van JavaScript waren er methoden voor het vensterobject met de naam alert()
, confirm()
en prompt()
.
Hoewel ze passen in het JavaScript van die tijd, is hun synchrone API problematisch voor moderne browsers. Omdat de JavaScript-engine moet pauzeren totdat een gebruikersreactie is verkregen, zijn de JavaScript-dialogen app-modaal. En omdat de dialogen app-modaal zijn, worden ze vaak (en helaas) gebruikt om onze gebruikers schade toe te brengen .
Daarom raadt het Chromium-team u ten zeerste aan geen JavaScript-dialogen te gebruiken.
Alternatieven
Er zijn veel opties voor dialoogvervanging.
Er zijn verschillende keuzes voor alert()/confirm()/prompt()
. Om de gebruiker op de hoogte te stellen van evenementen (bijvoorbeeld agendasites) moet de Notifications API worden gebruikt. Voor het verkrijgen van gebruikersinvoer moet het HTML-element <dialog>
worden gebruikt. Voor XSS proofs-of-concept kan console.log(document.origin)
van devtool worden gebruikt.
Wat onbeforeunload
betreft, moet worden opgemerkt dat dit al onbetrouwbaar is. Zoals Ilya Grigorik opmerkt : “Je kunt er niet op vertrouwen dat pagehide
, beforeunload
en unload
evenementen op mobiele platforms worden geactiveerd.” Als u de status wilt opslaan, moet u de Page Visibility API gebruiken.
Veranderingen
De mogelijkheid voor een pagina om de tekenreeks onbeforeunload
op te geven, is in Chrome 51 verwijderd . (Het werd ook verwijderd door Safari vanaf Safari 9.1 en in Firefox 4.)
alert()/confirm()/prompt()
dialogen zijn veranderd van app-modaal naar gesloten wanneer hun tabblad wordt gewijzigd van . Deze wijziging vond begin mei 2017 op alle kanalen plaats.
beforeunload
dialoogvensters worden verwijderd, is een gebruikersgebaar op de pagina vereist om ze te kunnen weergeven vanaf Chrome 60 . (Dit verandert niets aan de verzending van de beforeunload
gebeurtenis.) Dit brengt Chromium op één lijn met Firefox, dat deze wijziging heeft aangebracht met Firefox 44 .
Als u een alert()/confirm()/prompt()
dialoogvenster op volledig scherm weergeeft, gaat het volledige scherm verloren vanaf Chrome 61 .
prompt()
dialogen activeren hun tabblad niet. Als prompt()
wordt aangeroepen vanaf een achtergrondtabblad, keert de aanroep onmiddellijk terug en wordt er geen dialoogvenster weergegeven. Deze wijziging vond begin mei 2017 op alle kanalen plaats.
alert()
dialogen activeren hun tabblad niet. Als alert()
wordt aangeroepen vanaf een achtergrondtabblad, keert de aanroep onmiddellijk terug. Het tabblad is gemarkeerd met een indicator en de gebruiker ziet het dialoogvenster wanneer hij naar het tabblad overschakelt. Deze gedragsverandering is te zien vanaf Chrome 64 .
confirm()
dialoogvensters activeren hun tabblad niet. Als confirm()
wordt aangeroepen vanaf een achtergrondtabblad, keert de aanroep onmiddellijk terug en wordt er geen dialoogvenster weergegeven. Deze gedragsverandering is te zien vanaf Chrome 69 .
Vanwege deze wijzigingen wordt het, als uw site gebruikmaakt van dialoogvensters, ten zeerste aanbevolen om over te stappen op het gebruik van de eerder genoemde alternatieven, zodat dit geen gevolgen voor u heeft.