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执行。
相关问题