【问题标题】:Enable jQuery UI Dialog Button when a Valid Label from a jQuery UI Autocomplete is Selected选择 jQuery UI 自动完成中的有效标签时启用 jQuery UI 对话框按钮
【发布时间】:2011-12-21 09:17:33
【问题描述】:

我有一个 jQuery UI 对话框,其中包含一个填充有各种标签的 jQuery UI 自动完成输入框。对话框本身在按钮窗格中有两个按钮:“选择”和“取消”。但是,我想根据用户当前在输入框文本字段中的内容启用和禁用“选择”按钮。换句话说,自动完成使用的可用标签列表包含用户可以选择的所有有效选项。因此,如果他们从自动完成中选择其中一个标签,“选择”按钮将被启用,允许他们单击它。此外,如果他们只是输入正确的标签而没有从自动完成的下拉框中实际选择一个标签,我仍然希望启用这个“选择”按钮。

起初,我认为每次输入字段更改为可用标签列表时,我都会交叉引用当前输入框中的文本,以查看是否应该启用“选择”按钮,但到目前为止,它似乎没有工作。关于我如何做到这一点的任何建议?到目前为止,这是我尝试过的:

$("#dialog").dialog({
    autoOpen: false,
    buttons: {
        Select: function() {
            // Carry out some proceedure knowing they've selected a valid label.
        },
        Cancel: function() {
            // Cancels the selection and closes the dialog box.
        }
    },
    closeOnEscape: false,
    create: function(event, ui) {
        var labels = ["Bird", "Boar", "Dog", "Dragon", "Ox", "Tiger"];
        $("#input").autocomplete({
            delay: 0,
            source: labels
        });
        $("#input").change(function() {
            $(".ui-dialog-buttonpane button:contains('Select')").button("disable");
            labels.each(function() {
                if($("#input").text() == $(this)) {
                    $(".ui-dialog-buttonpane button:contains('Select')").button("enable");
                    return;
                }
            });
        });
    },
    draggable: false,
    modal: true,
    resizable: false,
    title: "Select Dialog",
    width: 460
});

【问题讨论】:

    标签: jquery jquery-ui jquery-ui-dialog jquery-ui-autocomplete


    【解决方案1】:

    您已经很接近了,使用$.inArray 切换按钮怎么样?此外,您需要使用$(this).val()this.value 来计算input 元素的值。

    $("#dialog").dialog({
        autoOpen: false,
        buttons: {
            Select: function() {
                // Carry out some proceedure knowing they've selected a valid label.
            },
            Cancel: function() {
                // Cancels the selection and closes the dialog box.
            }
        },
        closeOnEscape: false,
        create: function(event, ui) {
            var labels = ["Bird", "Boar", "Dog", "Dragon", "Ox", "Tiger"];
            $("#input").autocomplete({
                delay: 0,
                source: labels
            });
            $("#input").change(function() {
                var enabled = $.inArray(this.value, labels) >= 0 ? "enable" : "disable";
                $(".ui-dialog-buttonpane button:contains('Select')").button(enabled);
            });
        },
        draggable: false,
        modal: true,
        resizable: false,
        title: "Select Dialog",
        width: 460
    });
    

    示例: http://jsfiddle.net/kcrBB/


    根据评论,这是一个使用keyup 而不是更改的示例:

    $("#dialog").dialog({
        open: function () {
            $(".ui-dialog-buttonpane button:contains('Select')").button("disable");
        },
        buttons: {
            Select: function() {
                // Carry out some proceedure knowing they've selected a valid label.
            },
            Cancel: function() {
                // Cancels the selection and closes the dialog box.
            }
        },
        closeOnEscape: false,
        create: function(event, ui) {
            var labels = ["Bird", "Boar", "Dog", "Dragon", "Ox", "Tiger"];
            $("#input").autocomplete({
                delay: 0,
                source: labels,
                select: function () {
                    $(".ui-dialog-buttonpane button:contains('Select')").button("enable");       
                }
            });
    
            $("#input").keyup(function() {
                var enabled = $.inArray(this.value, labels) >= 0 ? "enable" : "disable";
                $(".ui-dialog-buttonpane button:contains('Select')").button(enabled);
            });
        },
        draggable: false,
        modal: true,
        resizable: false,
        title: "Select Dialog",
        width: 460
    });
    

    示例: http://jsfiddle.net/kcrBB/16/

    【讨论】:

    • 啊,我明白了。我遇到的一个问题是,它仅在您从自动完成中选择一个标签(这是完美的)或当用户在键入后按 Enter 时触发更改。无论如何添加或删除密钥时都要检查它吗?喜欢使用 keypress 或 keyup 事件而不是使用 change 事件?
    • 啊,好的,谢谢。我最初错过了禁用打开事件上的按钮,这让我很失望。您发布的第二个小提琴正是我正在寻找的。不幸的是,用户在单击其中一个自动完成标签后仍然必须按一个键才能触发检查。这是否可以与 Autocomplete 兼容的 select 事件结合使用?
    • 我设法让$(".ui-autocomplete").click() 触发了同样的检查,它就像一个魅力。谢谢。
    • @KrisSchouw:好点。我更新了第二个例子。我实际上会使用select 事件而不是绑定到click
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多