JavaScript 對話方塊的 Chromium 政策

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 指出:「您不能依賴 pagehidebeforeunloadunload 事件在行動平台上觸發」。如果您需要儲存狀態,建議使用 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 版起,您將看到這項行為變更。

基於這些異動,如果您的網站使用對話方塊,強烈建議您改用上述的替代方案,以免您受到影響。