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 版起,您將看到這項行為變更。
基於這些異動,如果您的網站使用對話方塊,強烈建議您改用上述的替代方案,以免您受到影響。