23

我正在開發使用window.showModalDialog的GreaseMonkey腳本。爲什麼不推薦使用window.showModalDialog?代替使用什麼?

但完成它之前,我已經發現,Firefox的29警告:

使用window.showModalDialog的()已過時。改爲使用window.open() 。如需更多幫助 https://developer.mozilla.org/en-US/docs/Web/API/Window.open

但問題是,window.open需求UniversalBrowserWrite特權,以使用window.open模式窗口打開。

那麼,爲什麼window.showModalDialog已棄用?有沒有不需要特權的API?

注意:我不想模態對話框(如jQuery的一個),我需要一個真正的模式其暫停JavaScript執行。

+0

閱讀:[window.showModalDialog:它是什麼,爲什麼你不應該使用它(http://tjvantoll.com/2012/05/02/showmodaldialog-what-it-is-and-why-你應該永遠不會使用它/),[dev.opera:從Web平臺刪除showModalDialog](http://dev.opera.com/blog/showmodaldialog/) – Bergi

+0

「我需要一個真正的模式,暫停JavaScript執行。」 Window.showModalDialog()會因其暫停JavaScript執行而精確折舊。暫停javascript執行很難安全地實現,並以某種方式提供響應式瀏覽器。這與爲什麼同步XMLHttpRequest也被折舊相似。 –

回答

2

目前,如果您不想使用權限並希望使用模式窗口,最好的方法是使用jQuery UI Dialog或類似的東西。

+0

但jQuery的模態對話框被稱爲*模態*,但它不是*模態*。我需要停止JavaScript執行。 – Oriol

+3

@Oriol你爲什麼要讓js執行暫停?在回調被調用之前,你不能做任何事嗎? – megawac

+0

在我的previos項目中,我有與window.open()和特權相同的問題。正因爲如此,我們決定使用jQuery。爲了防止執行js,我可以建議trow()函數或類似的東西。 –

-3

要阻止腳本執行,請使用while (true) { }。事實上,這與showModalDialog等效的不良行爲是他們刪除showModalDialog的部分原因。

此外,「模態」和「阻止腳本執行」不是同一回事。 「莫代爾」僅僅意味着一切,阻止你與這些事物互動。所以jQuery UI對話框是模態的,它們不會阻止腳本執行。

+4

嗯,但'while(true){}'是CPU密集型的,不是嗎?如果我這樣做,頁面(甚至瀏覽器)將會凍結,所以對話框也將無法使用。我只想暫停頁面,而不是對話框。 – Oriol

+0

你不能停止這個循環執行,因爲js是單線程的。用'window.open'窗口打開的窗口仍然使用相同的線程,並且會被完全凍結(你甚至可能永遠不會看到它們) –

22

爲什麼不推薦使用window.showModalDialog?

http://tjvantoll.com/2012/05/02/showmodaldialog-what-it-is-and-why-you-should-never-use-it/

一般把本地對話框執行到 瀏覽器的想法是一個很好的主意,但window.showModalDialog是一個糟糕的 實現,它是充滿了問題和瀏覽器支持不佳。 (...)

注意,(......)[使用showModalDialog一個模式對話框]是一個完整的HTML文檔 ,而不是被注入一個片段。這是一個window.showModalDialog表徵 功能。它實際上只是兩個完全相互通信的獨立窗口。事實上,你有兩個獨立的窗口和DOM,意味着你不必擔心JS衝突,如果你有很多糟糕的JavaScript 與混亂的全局範圍,這是吸引人的。但大多數情況下,這只是增加了不必要的複雜性,使瀏覽器實現複雜化,並且造成了一些bug。 (...)

雖然是很重要的模態對話框防止用戶 與原窗口進行交互,我們沒有理由對用戶 不應該被允許與其他標籤或瀏覽器原生 控件交互(前進/後退,收藏夾,地址欄等)。 (...)這是 實際上是一個很大的煩惱,最終用戶。 (...)

window.showModalDialog的調試體驗是可怕的。 (...)你基本上被迫像1999年一樣警覺,以確定 發生了什麼事情。 (...)

目前沒有主流的移動瀏覽器支持window.showModalDialog, 所以如果你正在尋找任何類型的平板/移動支持,你需要 遠離。

改爲使用什麼?

HTML5引入了新的<dialog>元素,可用於顯示對話框,包括模態對話框。

例如:

<dialog id="myDialog"> 
    Foo bar 
    <button id="hide">Close</button> 
</dialog> 
<button id="show">Show Dialog</button> 
var dialog = document.getElementById('myDialog'); 
document.getElementById('show').onclick = function() { dialog.showModal(); }; 
document.getElementById('hide').onclick = function() { dialog.close();  }; 

Demo

的問題是:

  • 瀏覽器支持目前可以忽略不計,但有一個polyfill
  • 它不是pause JS執行。
相關問題