为什么不推荐使用window.showModalDialog?用什么代替?

时间:2013-12-22 20:53:24

标签: javascript modal-dialog privileges window.open showmodaldialog

我正在开发一个使用window.showModalDialog的GreaseMonkey脚本。

但在完成之前,我发现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执行

4 个答案:

答案 0 :(得分:25)

为什么不推荐使用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&   DOM冲突,如果你有很多糟糕的JavaScript,那就很有吸引力了   杂乱的全球范围。但大多数情况下这只会增加不必   复杂性,使浏览器实现复杂化,并有助于   一些错误。 (...)

     

虽然模态对话框阻止用户进行操作非常重要   与原始窗口交互,用户没有理由   不应该被允许与其他标签或本机浏览器进行交互   控件(后退/前进,收藏夹,地址栏等)。 (...) 这是   实际上对最终用户来说是一个很大的烦恼。 (...)

     

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执行。

答案 1 :(得分:5)

如果您仍希望使用此解决方案,则可以使用showModalDialog polyfill <dialog>标记。

答案 2 :(得分:2)

目前,如果您不想使用权限并且想要使用模态窗口,最好的方法是使用jQuery UI Dialog或类似的东西。

答案 3 :(得分:-4)

要阻止脚本执行,请使用while (true) { }。这对于showModalDialog来说是等效的不良行为,这是他们删除showModalDialog的部分原因。

另外,“模态”和“阻止脚本执行”不是一回事。 “模态”仅仅意味着在其他一切之上,阻止你与这些事物互动。所以jQuery UI对话框是模态的,它们只是不阻止脚本执行。