[14] [[DOM]] の[[関数]] [DFN[[CODE(JS)@en[[[alert()]]]]]], [DFN[[CODE(JS)@en[[[confirm()]]]]]],
[DFN[[CODE(JS)@en[[[prompt()]]]]]] は、[[モーダルダイアログ]]を表示します。

* 仕様書

[REFS[
- [13] '''[CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#simple-dialogs>'''
- [33] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#the-window-object>
- [36] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#killing-scripts>
]REFS]

* 定義

[32] [CODE(DOMm)@en[[[alert]]]]、[CODE(DOMm)@en[[[confirm]]]]、[CODE(DOMm)@en[[[prompt]]]]
は、 [CODE(DOMi)@en[[[Window]]]] [[インターフェイス]]の[[メソッド]]です [SRC[>>33]]。

;; [35] [[ワーカー]]には存在しません。

[34] [CODE(DOMm)@en[[[prompt]]]] は2つ、それ以外は1つの [CODE(DOMi)@en[[[DOMString]]]]
[[引数]]をとりますが、いずれも省略可能で、その既定値は[[空文字列]]です [SRC[>>33]]。
第1引数はメッセージ、第2引数は既定値を表します。

* 動作

[41] 次の場合は、実際には[[ダイアログ]]を表示することなく、
呼び出し元に戻ることになっています。
[FIG(list)[
- [15] [[イベントループ]]の [[termination nesting level]] が零でない場合 [SRC[>>13]]。
つまり、 [CODE(DOMe)@en[[[beforeunload]]]] の処理中の場合。
- [42] [[文脈オブジェクト]]の[F[文書]]の[F[活性砂箱化フラグ集合]]の [F[sandboxed modals flag]] が設定されている場合 [SRC[>>13]]。
- [18] その他[[利用者エージェント]]が適切と考える場合 [SRC[>>13]]。
]FIG]

[43] [[termination nesting level]] が非零の場合は、仕様上は処理を続行してもしなくても良いことになっています。
実際には現在では続行しないのが普通と思われます。

[19] [[モーダルダイアログ]]は[[利用者]]の操作を妨害する使い方もできるので、
[[利用者]]の指示により、あるいは[[利用者エージェント]]の判断により何もしないことが認められているようです。
これが「その他」の場合です。

[EG[
[17] [[Webブラウザー]]によっては、「これ以上ダイアログを表示しない」
のようなオプションがダイアログ上にあり、それを[[利用者]]が選択すると以後[[ダイアログ]]を表示せずに呼び出し元に戻るようになっています。
[[スクリプト]]からは[[ダイアログ]]が表示されたかどうか確実に判断することはできません。
]EG]

[HISTORY[
[16] [[ダイアログ]]を表示する場合やその他の理由で表示しない場合 (>>18)
には、まず[[ストレージミューテックス]]を解放しなければ[['''なりません''']] [SRC[>>13]]。
ただし現状[[ストレージミューテックス]]を実装している[[Webブラウザー]]はありません。
]HISTORY]

[20] 表示するダイアログは、次のようなものです。
[FIG(list)[
- [44] [CODE(JS)@en[[[alert()]]]] はメッセージを示す [SRC[>>13]] だけのもの
- [45] [CODE(JS)@en[[[confirm()]]]] はメッセージを示して肯定的または否定的な返答を[[利用者]]に選ばせる [SRC[>>13]] もの
- [46] [CODE(JS)@en[[[prompt()]]]] はメッセージと既定値を示して、
文字列を[[利用者]]に記述させる
(または[RUBYB[中止]@en[abort]]させる) [SRC[>>13]] もの
-- [25] 既定値の扱いについては[[モーダルダイアログ]]も参照
]FIG]

[21] [CODE(JS)@en[[[confirm()]]]] と [CODE(JS)@en[[[prompt()]]]] では、
ダイアログに対して[[利用者]]が返答するまで、[[イベントループ]]は [[pause][pause (event loop)]] しなければ[['''なりません''']]。
[CODE(JS)@en[[[alert()]]]] では [[pause][pause (event loop)]] してもしなくても構いません。 [SRC[>>13]]

;; [22] 現行 [[Webブラウザー]]は [CODE(JS)@en[[[alert()]]]] でも [[pause][pause (event loop)]] するようです。
しかしどちらの挙動か[[著者]]には厳密には判定できません。

[23] [CODE(JS)@en[[[alert()]]]] は何も返さず、 [CODE(JS)@en[[[confirm()]]]] は返答を[[真偽値]]で返し、
[CODE(JS)@en[[[prompt()]]]] は返答を[[文字列]]で返します。
ダイアログを表示しなかった場合や中止された場合には、
それぞれ[[偽]]と [[null]] を返します。 [SRC[>>13]]

* レンダリング

[24] [[ダイアログ]]には、[[スクリプト]]が指定した[[文字列]]の一部または全部が表示されることが期待されています。

;; [[モーダルダイアログ]]参照。

[26] かつては指定された文字列だけが[[プラットフォーム]]側の対応するダイアログ API
に渡されていた時代もありましたが、現在の [[Webブラウザー]]では[[フィッシング]]防止などの理由でページの[[題名]]や[[起源]]などの表示を付け加えた文字列がレンダリングされるようになっています。

[27] また並行する他の処理や異なる[[起源]]の[[タブ]]や[[窓]]の扱いと[[モーダル]]性の両立のためか、
[[プラットフォーム]]側のダイアログ [[API]] を使わず、独自の方法でレンダリングする実装も増えています。

[28] [[ボタン]]は「OK」と「キャンセル」に相当する文字列 ([[プラットフォーム]]によって[[地域化]]されたもの)
を使うのが普通です。また[[ボタン]]の順序やメッセージとの位置関係も、[[プラットフォーム]]の慣習によります。

;; [29] [CODE(JS)@en[[[confirm()]]]] の[[ボタン]]は「はい」「いいえ」ではありませんが、
「はい」「いいえ」が回答になるような質問文がメッセージとして指定されることがよくあります。
一方で「○○ならOK、××ならキャンセル」のように「OK」や「キャンセル」のような特定のボタンのラベルを期待した質問文が使われることもあります。

[37] これらの[[ダイアログ]]には、[[スクリプト]]を停止させるオプションも用意することがすすめられています [SRC[>>36]]。

* 用法

[30] これらのダイアログは[[プラットフォーム]]または [[Webブラウザー]]の提供するごく基本的な [[UI]]
によりそのまま[[レンダリング]]するだけのもので、表現力に乏しく、
[[Webサイト]]の視覚的デザインとの統合性にも欠けることから、
積極的に使うものではないと一般的には考えられています。その一方でその簡便さから、
機能の利用頻度や [[Webサイト]]における視覚的デザインの重要性その他の判断次第で、
これらのダイアログがそのまま採用されている場合も数多く存在します。

[31] [CODE(JS)@en[[[alert()]]]] は、いわゆる [[printデバッグ]]の手法としても非常によく用いられています。
ただし呼び出し回数が多い場合はダイアログを閉じる手間がかかることや、
[[イベントループ]]との総合作用を[[副作用]]として与えてしまうことから、
[CODE(JS)@en[[[console.log]]]] を使うことも最近は増えてきています。
[[Webブラウザー]]によっては [CODE(JS)@en[[[console.log]]]] 
で指定されたオブジェクトの内容をデバッグツールにより調べられるなど、
より便利になっています。

* 歴史

[1] [CITE[Opera が唯一 javascript:for(;;)alert([SPAN['][SPAN[']]); に対抗できるブラウザ - 冬通りに消え行く制服ガールは、夢物語にリアルを求めない。 - subtech]]
([TIME[2010-01-01 12:17:22 +09:00]] 版)
<http://subtech.g.hatena.ne.jp/cho45/20091224/1261585798>

[2] [CITE[Issue 68780 - chromium - Disallow alert/confirm/prompt/showModalDialog calls issued from within an unload handler - Project Hosting on Google Code]]
([TIME[2011-03-01 14:55:59 +09:00]] 版)
<http://code.google.com/p/chromium/issues/detail?id=68780>

[3] [CITE@ja[javascript初心者なのですが、alert関数に設定できる文字数は何.. - 人力検索はてな]]
([TIME[2011-06-01 17:09:38 +09:00]] 版)
<http://q.hatena.ne.jp/1306857041>

[4] [CITE['''['''whatwg''']''' Can we deprecate alert(), confirm(), prompt() ?]]
([TIME[2011-06-09 16:52:01 +09:00]] 版)
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2011-June/031979.html>

[5] [CITE[''''''[''''''whatwg'''''']'''''' Can we deprecate alert(), confirm(), prompt() ?]]
( ([TIME[2012-02-07 19:19:19 +09:00]] 版))
<http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-February/034695.html>

[6] [CITE@en[Web Applications 1.0 r6966     Allow browsers to bail early for showModalDialog, alert, confirm, and prompt during pagehide, beforeunload, and unload events.]]
( ([TIME[2012-02-07 07:54:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=6965&to=6966>

[7] [CITE[''''''[''''''whatwg'''''']'''''' Can we deprecate alert(), confirm(), prompt() ?]]
( ([TIME[2012-06-09 06:50:21 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2012-June/036332.html>

[8] [CITE@en[Web Applications 1.0 r7431     Allow UAs to implement abuse protection in alert() and company.]]
( ([TIME[2012-10-03 07:52:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7430&to=7431>

[9] [CITE@en[Web Applications 1.0 r7832     Make alert() and company match more browsers, and some internal notes. Sorry, lost track of which bugs this fixes due to build process issues.]]
( ([TIME[2013-04-14 16:26:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7831&to=7832>

[11] [CITE[Bug 563556 – Cleanup nsGlobalWindow's alert/confirm/prompt]]
([TIME[2011-02-28 10:55:20 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=563556>

[12] [CITE['''['''whatwg''']''' Optional non-blocking mode for simple dialogs (alert, confirm, prompt).]]
([TIME[2011-02-28 04:50:36 +09:00]] 版)
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2011-February/030670.html>

[38] [CITE@en[Bug 25686 – alert() needs two overloads so alert(undefined) can alert "undefined"]]
( ([TIME[2014-05-16 03:11:11 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=25686>

[39] [CITE@en[Web Applications 1.0 r8638 for compat, apparently alert() should alert '' and alert(undefined) should alert 'undefined']]
( ([TIME[2014-05-17 01:53:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8637&to=8638>

[40] [CITE[社内SEの徒然なる日記 proxy.pac(プロキシパック)対応 No.8 pac作成(デバッグ)]]
( ([[たかたかハリコフ]] 著, [TIME[2014-10-31 13:12:44 +09:00]] 版))
<http://harikofu.blog.fc2.com/blog-entry-517.html>

[10] [CITE@en[Block modal dialogs by default in sandboxed documents · whatwg/html@bbccfc9]] ([TIME[2015-09-10 00:20:23 +09:00]] 版) <https://github.com/whatwg/html/commit/bbccfc976754def0c187ac8ce5891d2fb20dfc15>

[47] [CITE@en[Remove the storage mutex due to lack of implementation · whatwg/html@1b918cf]] ([TIME[2015-12-16 14:38:10 +09:00]] 版) <https://github.com/whatwg/html/commit/1b918cf72fcbba011f83b92ab5d1f483fb1cafa3>

[48] [CITE@en[Allow truncation of alert/confirm/prompt text · whatwg/html@56f5c5e]]
([TIME[2016-02-21 12:52:31 +09:00]] 版)
<https://github.com/whatwg/html/commit/56f5c5e39b8b43b4bd4a8007fdc56ad797a5b2a7>

[49] [CITE@en[Issue 267101 - chromium - myIpAddress() in PAC script doesn't return expected result - Monorail]]
( ([TIME[2016-06-16 19:36:25 +09:00]]))
<https://bugs.chromium.org/p/chromium/issues/detail?id=267101>

[50] [CITE@en[Use the Window's associated Document for allow-modals sandbox checks]]
([[domenic]]著, [TIME[2016-07-14 06:37:56 +09:00]])
<https://github.com/whatwg/html/commit/29ebd5b6e8c4ba4006115a784c5c6c87dc151489>

[51] [CITE@en[Add new neutral return-value option to window.confirm? · Issue #2838 · whatwg/html]]
([TIME[2017-07-15 14:38:18 +09:00]])
<https://github.com/whatwg/html/issues/2838>

[52] [CITE@en[New in Chrome 64  |  Web  |  Google Developers]]
([TIME[2018-03-06 04:54:20 +09:00]])
<https://developers.google.com/web/updates/2018/01/nic64>

[53] [CITE@en[Simplify Window.alert IDL · Issue #3822 · whatwg/html]]
([TIME[2018-07-26 22:38:39 +09:00]])
<https://github.com/whatwg/html/issues/3822>

[54] [CITE@en[Deprecations and removals in Chrome 69  |  Web  |  Google Developers]]
([TIME[2018-08-03 01:49:07 +09:00]])
<https://developers.google.com/web/updates/2018/08/chrome-69-deps-rems>

[55] [CITE@en[Treat CR, LF, CRLF the same for alert/confirm/prompt]]
([[domenic]]著, [TIME[2018-11-21 08:19:05 +09:00]])
<https://github.com/whatwg/html/commit/76638126838951c21aee4a1220cd0a4e57f3081d>

[56] [CITE@en[Remove alert(), confirm(), and prompt for cross origin iframes - Chrome Platform Status]]
([TIME[2021-08-02T06:08:39.000Z]])
<https://www.chromestatus.com/feature/5148698084376576>

[57] [CITE[Chrome92からalert,confirmの動作の仕様変更でGASのWEBアプリで困った件 - Qiita]]
([TIME[2021-08-02T06:08:51.000Z]])
<https://qiita.com/basictomonokai/items/928ca76bd1f985dd067d>