1

次のような jQueryUI ダイアログを使用しています。

$("#PersonDialog").dialog({
        bgiframe : true,
        autoOpen : false,
        closeOnEscape : true,
        resizable : false,
        height : 150,
        modal : true,
        open: function(){
               activeWindow="dialog"
        },
        close: function(){
               activeWindow="person"
        }
        ....
        ....
    })

エスケープが押されたときに閉じたいdivもいくつかあります。この回答のコードも使用しますが、問題は解決しませんでした:

$("body").bindFirst("keydown", function(e) {
        console.info(activeWindow)
            if (e.keyCode == 27) {
                switch(activeWindow){
                    case "dialog":
                         //do something
                    break;
                    case "person":
                        //do something else
                    break;
                    ....
            }
        }
    })
$.fn.bindFirst = function(name, fn) {
    this.on(name, fn);
    this.each(function() {
        var handlers = $._data(this, 'events')[name.split('.')[0]];
        var handler = handlers.pop();
        handlers.splice(0, 0, handler);
    });
};

私の問題は、ダイアログが開いているときにエスケープを押すと、両方 (div とダイアログ) が閉じられ、console.info(activeWindow)「人」が返されることです。closeOnEscapeそれがキーダウンイベントよりも最初に発生すると思います。これを変更する方法はありますか?

4

1 に答える 1

1

jQueryUI ダイアログ プラグインは、keydown イベント ハンドラを「body」ではなく、ダイアログ ラッパーにバインドします。したがって、ハンドラーをボディにバインドし、ダイアログでイベントが発生すると、イベントのバブリングの原則に従って、ダイアログ ハンドラーが最初に実行されます。

だから、あなたができることは、 でダイアログを呼び出しcloseOnEscape : false、ボディの ESC キーを好きなように処理することです。

ダイアログを閉じるには$("#PersonDialog").dialog("close")、そこから呼び出すだけです。

于 2013-05-29T09:15:33.893 に答える