JavaScript ダイアログの履歴
JavaScript は 1995 年に導入され、JavaScript の最初のバージョンでは、alert()
、confirm()
、prompt()
と名付けられたウィンドウ オブジェクトに対するメソッドでした。
この同期 API は、当時の JavaScript には馴染みませんが、最新のブラウザでは問題となります。JavaScript エンジンは、ユーザーのレスポンスを取得するまで一時停止する必要があるため、JavaScript ダイアログはアプリモーダルです。このダイアログはアプリモーダルであるため、一般に(残念ながら)Google ユーザーに害を及ぼすために使用されます。
そのため、Chromium チームでは、JavaScript ダイアログを使用しないことを強くおすすめします。
代替
ダイアログの置き換えには多くのオプションがあります。
alert()/confirm()/prompt()
には複数の選択肢があります。ユーザーにイベント(カレンダー サイトなど)を通知するには、Notifications API を使用する必要があります。ユーザー入力を取得するには、HTML <dialog>
要素を使用する必要があります。XSS の概念実証には、devtool の console.log(document.origin)
を使用できます。
onbeforeunload
については、すでに信頼できないことに留意してください。Ilya Grigorik 氏が指摘しているように、「モバイル プラットフォームで pagehide
、beforeunload
、unload
のイベントを呼び出すことはできません」と述べています。状態を保存する必要がある場合は、Page Visibility API を使用する必要があります。
変化あり
ページで onbeforeunload
文字列を指定する機能は、Chrome 51 で削除されました。(Safari でも 9.1 から、Firefox 4 で削除されました)。
alert()/confirm()/prompt()
ダイアログが、アプリモーダルからタブの切り替え時に閉じられるようになりました。この変更は 2017 年 5 月初旬にすべてのチャネルに適用されています。
beforeunload
ダイアログが Chrome 60 以降で表示されるようにするには、ページ上でのユーザー操作が必要となります。(beforeunload
イベントのディスパッチには影響しません)。この変更は Firefox 44 で採用され、Chromium と Firefox の連携と同じです。
Chrome 61 以降で全画面表示の状態で alert()/confirm()/prompt()
ダイアログを表示すると、全画面表示が無効になります。
prompt()
のダイアログでタブが有効になりません。prompt()
がバックグラウンドタブから呼び出された場合、呼び出しはすぐに返され、ダイアログは表示されません。この変更は、2017 年 5 月初旬にすべてのチャネルに適用されました。
alert()
のダイアログでタブが有効になりません。alert()
がバックグラウンド タブから呼び出されると、呼び出しはすぐに返されます。タブにはインジケーターが表示され、ユーザーがタブに切り替えるとダイアログが表示されます。この動作変更は Chrome 64 以降に適用されます。
confirm()
のダイアログでタブが有効になりません。confirm()
がバックグラウンドタブから呼び出された場合、呼び出しはすぐに返され、ダイアログは表示されません。この動作変更は Chrome 69 以降に適用されます。
この変更により、サイトでダイアログを使用している場合は、上記の代替手段に移行して影響を受けないようにすることを強くおすすめします。