Why is window.showModalDialog deprecated? What to use instead?

 ̄綄美尐妖づ 提交于 2019-12-17 04:33:49

问题


I was developing a GreaseMonkey script which used window.showModalDialog.

But before finishing it, I have discovered that Firefox 29 warns:

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

But the problem is that window.open needs UniversalBrowserWrite privilege in order to open a modal window using window.open.

Then, why is window.showModalDialog deprecated? Is there any API which doesn't require privileges?

Note: I don't want a fake modal dialog (like jQuery's one), I need a real modal which pauses JavaScript execution.


回答1:


Why is window.showModalDialog deprecated?

From 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 was a bad implementation that is riddled with issues and poor browser support. (...)

Note that (...) [a modal dialog using showModalDialog] is a full HTML document, not a snippet that is injected in. This is a characterizing feature of window.showModalDialog. It’s really just two completely separate windows communicating with each other. The fact that you have two separate windows and DOMs means you don’t have to worry about JS & DOM conflicts, which is appealing if you have a lot of bad JavaScript with a cluttered global scope. But mostly this just adds unnecessary complexity, complicates the browser implementation, and contributes to a number of bugs. (...)

While it’s important that modal dialogs prevent the user from interacting with the originating window, there’s no reason the user shouldn’t be allowed to interact with other tabs or native browser controls (back/forward, favorites, address bar, etc). (...) This is actually a big annoyance to the end user. (...)

The debugging experience for window.showModalDialog is horrible. (...) You're basically forced to alert like it’s 1999 to determine what’s going on. (...)

Currently no major mobile browsers support window.showModalDialog, so if you’re looking for any sort of tablet / mobile support you need to stay away.

What to use instead?

HTML5 introduces the new <dialog> element, which can be used to display dialogs, including modal ones.

For example:

<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

The problems are:

  • Browser support is currently negligible, but there is a polyfill.
  • It doesn't pause JS execution.



回答2:


You can use my showModalDialog polyfill using <dialog> tag if you want to still use this solution.




回答3:


Currently, if you don't want to use privileges and want to use modal window, best way is to use jQuery UI Dialog or something similar.




回答4:


To block script execution, use while (true) { }. The fact that this is equivalently bad behavior to showModalDialog is part of the reason they removed showModalDialog.

Also, "modal" and "blocking script execution" are not the same thing. "Modal" simply means on top of everything else, preventing you from interacting with those things. So jQuery UI dialogs are modal, they just don't block script execution.



来源:https://stackoverflow.com/questions/20733962/why-is-window-showmodaldialog-deprecated-what-to-use-instead

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!