首頁>Program>source

我正在開發使用 window.showModalDialog的GreaseMonkey指令碼

但是在完成之前,我發現Firefox 29警告:

Use of window.showModalDialog() is deprecated. Use window.open() instead. For more help https://developer.mozilla.org/en-US/docs/Web/API/Window.open

但是問题在於, window.open 需要 UniversalBrowserWrite 特權以便使用 window.open打開模式視窗

然後,為什麼是 window.showModalDialog 不赞成使用? 是否有不需要特權的API?

Note :我不要 fake 模態對话框(如jQuery的對话框),我需要一个 real 暂停JavaScript執行的模式。

最新回復
  • 5月前
    1 #

    Why is window.showModalDialog deprecated?

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

    In general the idea of putting a native dialog implementation into the browser was a really good idea, but window.showModalDialog 不好 出現問题且瀏覽器支援不佳的實施. (...)

    請註意,(...)[使用 showModalDialog的模式對话框 ]是完整的HTML 文件,而不是插入的代碼段。這是一个特征 window.showModalDialog的功能 .完全只有两个 相互通訊的独立視窗.你有的事實 两个独立的視窗和DOM意味着您不必担心JS和 DOM冲突,如果您有很多不好的JavaScript,這会很有吸引力 具有混亂的全球範圍.但這大多只是增加了不必要的 複雜性,使瀏覽器的實現複雜化,並有助於 许多錯誤. (...)

    模式對话框阻止使用者进行操作很重要 与原始視窗进行互動時,使用者没有理由 不應与其他標簽頁或本機瀏覽器进行互動 控制元件(後退/前进,收藏夹,地址欄等). (...) 這是 實際上给最终使用者帶来很大的煩恼. (...)

    window.showModalDialog的除錯经驗 太恐怖了 (...)基本上,您会像1999年那樣被迫提醒 這是怎麼迴事. (...)

    当前没有主要的移動瀏覽器支援 window.showModalDialog , 因此,如果您正在尋找各種平板電脑/移動設備支援,則需要 远离。

    What to use instead?

    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

    問题是:

      Browser support is currently negligible, but there is a polyfill.

      It doesn't pause JS execution.

    p

    您可以使用 <dialog>使用我的showModalDialog polyfill

  • 5月前
    2 #

    当前,如果您不想使用特權並且想要使用模式視窗,最好的方法是使用jQuery UI Dialog或類似的工具.

  • 5月前
    3 #

    要阻止指令碼執行,請使用 while (true) { } .對 showModalDialog而言,這是等效的不良行為 是他们删除了 showModalDialog的部分原因

    此外,"模態"和"阻止指令碼執行"也不是同一迴事. "模態"只是意味着在所有其他事物之上,阻止您与這些事物进行互動.因此,jQuery UI對话框是模態的,它们只是不阻止指令碼執行。

  • c#:委託Roslyn中的快取行為更改
  • 在Excel VBA中删除一行