如何在ui-dialog onClose之前触发keydown事件?

时间:2013-05-28 09:50:06

标签: jquery event-handling jquery-ui-dialog

我正在使用一些像这样的jQueryUI对话框:

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

我还有一些div,我想在按下escape时关闭它们。我也使用this answer中的代码,但它并没有解决我的问题:

$("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)返回" person"。我想首先触发closeOnEscape而不是keydown事件。有没有办法改变这个?

1 个答案:

答案 0 :(得分:1)

jQueryUI对话框插件将keydown事件处理程序绑定到对话框包装器,而不是“body”。 因此,当您将处理程序绑定到body并且事件发生在对话框上时,将根据事件冒泡原则首先执行对话框处理程序。

所以,我认为,你可以做的 - 只是用closeOnEscape : false调用对话框,并以你喜欢的方式处理身体上的ESC键,就像你已经做的那样。

要关闭对话框,您只需从那里拨打$("#PersonDialog").dialog("close")