JavaScript 對話方塊記錄
JavaScript 是在 1995 年推出,而在 JavaScript 第一版中,就是在名為 alert()
、confirm()
和 prompt()
的視窗物件上採用方法。
雖然它們符合 JavaScript 的時間,但對新式瀏覽器而言,同步 API 卻感到不解。因為 JavaScript 引擎必須暫停直到收到使用者回應為止,所以 JavaScript 對話方塊會以應用程式互動方式執行。而且,由於對話方塊是應用程式形式的,所以經常 (無可惜) 也會用來「傷害」使用者。
因此,Chromium 團隊強烈建議不要使用 JavaScript 對話方塊。
替代選項
系統替換對話方塊的選項有很多種。
我們為 alert()/confirm()/prompt()
提供幾種選擇。如要通知使用者事件 (例如日曆網站),應使用 Notifications API。如要取得使用者輸入內容,請使用 HTML <dialog>
元素。對於 XSS 概念驗證,可以使用 Devtool 的 console.log(document.origin)
。
如同 onbeforeunload
,請注意應用程式「已經」不穩定。由於 Ilya Grigorik 指出:「您不能依賴 pagehide
、beforeunload
和 unload
事件在行動平台上觸發」。如果您需要儲存狀態,建議使用 Page Visibility API。
異動
Chrome 51 版已經移除網頁指定 onbeforeunload
字串的功能。(Safari 9.1 和 Firefox 4 起,Safari 也會移除這個項目)。
alert()/confirm()/prompt()
對話方塊已從應用程式強制回應改為在分頁切換時關閉。這項異動已於 2017 年 5 月初全面生效。
beforeunload
對話方塊需要網頁上的使用者手勢,才能顯示從 Chrome 60 啟動。(這不會變更 beforeunload
事件的分派作業)。這項變更與 Firefox 一致,因此這個版本的改變與 Firefox 44 一致。
在全螢幕模式中顯示 alert()/confirm()/prompt()
對話方塊會導致 自 Chrome 61 版起失去全螢幕。
prompt()
對話方塊不會啟用其分頁。如果從背景分頁呼叫 prompt()
,呼叫會立即傳回,且不會顯示對話方塊。這項變更將於 2017 年 5 月初生效,範圍涵蓋所有管道。
alert()
對話方塊不會啟用其分頁。如果從背景分頁呼叫 alert()
,呼叫會立即傳回。分頁會標上指標,使用者切換至分頁時就會看到對話方塊。自 Chrome 64 版起,這項行為變更就會出現。
confirm()
對話方塊不會啟用其分頁。如果從背景分頁呼叫 confirm()
,呼叫會立即傳回,且不會顯示對話方塊。自 Chrome 69 版起,您將看到這項行為變更。
基於這些異動,如果您的網站使用對話方塊,強烈建議您改用上述的替代方案,以免您受到影響。