32

を使用する GreaseMonkey スクリプトを開発していましたwindow.showModalDialog

しかし、それを終える前に、Firefox 29 が警告することを発見しました:

window.showModalDialog() の使用は非推奨です。代わりに window.open() を使用してください。詳細については https://developer.mozilla.org/en-US/docs/Web/API/Window.open

しかし、問題は、を使用してモーダル ウィンドウを開くために権限がwindow.open必要なことです。UniversalBrowserWritewindow.open

では、なぜwindow.showModalDialog廃止されたのでしょうか。特権を必要としない API はありますか?

注:偽のモーダル ダイアログ (jQuery のものなど) は必要ありません。JavaScript の実行を一時停止する実際のモーダルが必要です。

4

4 に答える 4

28

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。実際には、互いに通信する 2 つの完全に独立したウィンドウにすぎません。2 つの別個のウィンドウと DOM があるという事実は、JS と DOM の競合を心配する必要がないことを意味します。これは、雑然としたグローバル スコープを持つ悪い JavaScript がたくさんある場合に魅力的です。しかし、ほとんどの場合、これは不要な複雑さを追加し、ブラウザーの実装を複雑にし、多くのバグの原因となります。(...)

モーダル ダイアログによってユーザーが元のウィンドウを操作できないようにすることは重要ですが、ユーザーが他のタブやネイティブ ブラウザー コントロール (戻る/進む、お気に入り、アドレス バーなど) を操作できないようにする理由はありません。(...) これは、実際にはエンド ユーザーにとって大きな迷惑です。(...)

のデバッグ体験window.showModalDialogはひどいものです。(...) 何が起こっているのかを判断するために、基本的には 1999 年のように警告する必要があります。(...)

現在、主要なモバイル ブラウザはサポートwindow.showModalDialogされていないため、何らかの種類のタブレット/モバイル サポートを探している場合は、近づかないようにする必要があります。

代わりに何を使用しますか?

<dialog>HTML5 では、モーダル ダイアログを含むダイアログを表示するために使用できる新しい要素が導入されています。

例えば:

<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();      };

デモ

問題は次のとおりです。

  • ブラウザのサポートは現在のところごくわずかですが、ポリフィルがあります。
  • JS の実行を一時停止しません。
于 2014-08-19T18:28:15.073 に答える
6

このソリューションを引き続き使用する場合は、タグを使用して私のshowModalDialog ポリフィルを使用できます。<dialog>

于 2014-08-19T05:10:54.647 に答える
-1

スクリプトの実行をブロックするには、while (true) { }. これが同等に悪い動作であるという事実はshowModalDialog、彼らが削除した理由の一部ですshowModalDialog

また、「モーダル」と「スクリプトの実行をブロックする」は同じものではありません。「モーダル」とは単に、他のすべての上にあることを意味し、それらとのやり取りを防ぎます。したがって、jQuery UI ダイアログはモーダルであり、スクリプトの実行をブロックしません。

于 2014-03-12T17:38:58.160 に答える