ページにいくつかのモーダル ダイアログがあり、さらに多くのダイアログが表示されます。それらすべてにモーダル ダイアログを使用し、オーバーレイ クリックでそれらを閉じる予定です。ダイアログをインスタンス化するすべての場所でオーバーレイクリックイベントをバインドしたくないので、ダイアログプロトタイプまたは同様のものを拡張して、すべてのモーダルダイアログのクリックイベントをグローバルにバインドしたいと思います。
http://jsfiddle.net/jurchiks/kLBJm/1/
次のダイアログ コンストラクタがあるとします。
$('#dialog').dialog({
modal: true,
open: function()
{
$(this).find('input[type=text]').focus();
}
});
ダイアログのインスタンス化の前にこのコードを入れてみました:
$.extend(
$.ui.dialog.prototype.options,
{
open: function()
{
var dialog = this;
$('.ui-widget-overlay').on('click', function()
{
$(dialog).dialog('close');
});
}
}
);
jQuery は、ダイアログ パラメータで渡された open 関数のみを呼び出します。これは単にデフォルトのopen関数を変更し、コンストラクターに渡されるものはすべてこれをオーバーライドしているのではないかと疑っています。
$.widget(
"ui.dialog",
$.ui.dialog,
{
open: function()
{
this._super();
var dialog = this;
$('.ui-widget-overlay').on('click', function()
{
$(dialog).dialog('close');
});
}
}
);
これも機能しません。jQuery はエラーを吐き出します - 「初期化前にダイアログでメソッドを呼び出すことはできません。メソッド 'close' を呼び出そうとしました」 - ポップアップが開いている場合でも。オーバーレイのクリック & クローズ イベントがグローバルでオーバーライドできないようにするにはどうすればよいですか?
PSなぜこれがjQuery UIライブラリによって提供されないのですか? これは非常に人気のあるものだと思います。