jquery - 对焦被触发两次

标签 jquery jquery-ui jquery-ui-dialog

我有一个文本框和一个 Jquery UI 对话框。当用户在文本框中输入完毕并按 Enter 后,我想显示该对话框。为了实现这一点,我使用以下代码:

$(document).ready(function () {
    var helpDial = $('#helpDialog');
    var input = $('#helpSearch');

    helpDial.dialog({
        width: 800,
        autoOpen: false,
        modal: true,
        title: "Templates",
        position: [165, 158]
    });

    input.focusin(function () {
        helpDial.dialog('close');
    }).focusout(function () {
        helpDial.dialog('open');
    }).on('keypress', function (e) {
        var code = (e.keyCode ? e.keyCode : e.which);
        if (code == 13) {
            input.focusout();
            return false;
        }
    });
});

<input id="helpSearch" />
<div id="helpDialog"></div>

http://jsfiddle.net/7Fpm4/1

问题是,当我按 Enter 时,focusout 被调用两次,一次来自 input.focusout(),第二次是在 之后focusout 事件处理程序中的 helpDial.dialog('open')。这会导致创建两个背景叠加层,当我关闭对话框时,一个叠加层仍然可见。

我做错了什么?有没有更好的方法来处理这种情况——“在文本字段中按下回车键会打开一个 jQuery 对话框”。谢谢。

最佳答案

防止事件触发的唯一方法是取消事件处理程序的绑定(bind)。或者,根据情况,根据事件触发时可用的信息采取不同的操作。

只要元素失去焦点,就会触发 focusout 事件。在这种情况下,每次用户单击文本框时,都会触发 focusin 事件。一旦光标离开文本框(打开对话框时就会发生这种情况),就会触发 focusout 事件。

您代码的问题在于,您强制调用了 focusout 事件,然后当您打开对话框时,自然会调用 focusout 事件。因此,按如下方式更改代码:

$(document).ready(function () {
    var helpDial = $('#helpDialog');
    var input = $('#helpSearch');

    helpDial.dialog({
        width: 800,
        autoOpen: false,
        modal: true,
        title: "Templates",
        position: [165, 158]
    });

    input.on('focusin', function () {
        input.on("focusout", textboxFocusOut);
    }).on('keypress', function (e) {
        var code = (e.keyCode ? e.keyCode : e.which);
        if (code == 13) {
            textboxFocusOut();
        }
    });

    function textboxFocusOut() {
        input.off("focusout", textboxFocusOut);
        helpDial.dialog('open');                
    }

});

http://jsfiddle.net/8L7EL/1/

此代码的作用是将函数绑定(bind)到 focusin 处理程序内的 focusout 。如果用户离开文本框,将调用 focusout 事件处理程序,该处理程序会立即取消绑定(bind) focusout 事件(以防止多次绑定(bind)该函数)。如果用户按下 Enter 键,则会手动调用该函数,这会在打开对话框之前删除 focusout 事件处理程序,以防止在打开对话框时自动触发 focusout 事件。对话框打开。

关于jquery - 对焦被触发两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11713872/

相关文章:

jquery - 将部分 View 加载到 jquery-ui 对话框时 $.validator.unobtrusive.parse 不起作用?

java - 如何在 Wicket 中启动文件下载并关闭 (jQuery) 对话框?

javascript - 如果添加了带有标题的新行,为什么 dataTable 不起作用

javascript - 如何在一串html中获取标题标签?

javascript - 如何使用 AngularJS ui-date 指令格式化初始日期值?

jquery - 如何重新分配 jQueryUI 对话框关闭按钮事件

Jquery $(this) 在类选择器中不起作用

javascript - 无法计算元素的大小

javascript - 如何从 javascript 打开 JQuery selectmenu 插件?

jquery 代码使用附加显示对 html 表的 json 响应