javascript - 使用复选框从 jquery 自动完成中选择多个选项

标签 javascript jquery autocomplete jquery-ui-autocomplete

我正在使用 jquery autocomplete .

我正在尝试下面的代码

HTML

<textarea class="search-element"></textarea>

脚本

var data = [
               "ActionScript",
               "AppleScript",
               "Asp",
               "BASIC",
               "C++",
               "Clojure",
               "COBOL",
               "ColdFusion"
        ];
        $(function () {
            var $this;
            var singleSelectOptions = {
                source: function (request, response) {
                   response($.map(data, function (item) {
                      return {
                        label: item,
                      }
                   }));
                },
                select: function (event, ui) {
                   $($this).autocomplete("close");
                   $($this).val($($this).val() + '\n' + ui.label)
                 },
                 minLength: 0,
                 open: function () {
                    $("ul.ui-menu").width($(this).innerWidth());
                 }
            }
            $(document).find('textarea[class*="search-element"]').live('keydown', function () {
                $($this).autocomplete(singleSelectOptions);
            }).live('focus', function () {
                $this = $(this);
                var text = $this.val();
                if (text == '') {
                    $($this).autocomplete(singleSelectOptions);
                    $($this).autocomplete("search");
                }
          });
        })

通过使用此代码,我一次只能选择一个选项 但我需要使用复选框选择多个选项

现在我的结果是这样显示的

enter image description here

但我想要如下结果,当我们选中复选框时,自动完成不应关闭,所选选项应以逗号分隔填写相关文本区域,当我们取消选中复选框时,该选项应从文本区域中删除。我可以更新文本区域的文本。

enter image description here

Here is my fiddle

最佳答案

我尝试了以下代码,我的目标由此实现。

HTML

 <textarea class="multiselect-element"></textarea>

脚本

 var data = [
                   "ActionScript",
                   "AppleScript",
                   "Asp",
                   "BASIC",
                   "C++",
                   "Clojure",
                   "COBOL",
                   "ColdFusion"
            ];
            function split(val) {
    return val.split(/,\s*/);
}
function extractLast(term) {
    return split(term).pop();
}
function bindAutoComplete(ele, options) {
    var text = ele.val();
    text = text == null || text == undefined ? "" : text;
    $(ele).autocomplete(options).data("autocomplete")._renderItem = function (ul, item) {
        var checked = (text.indexOf(item.label + ', ') > -1 ? 'checked' : '');
        return $("<li></li>")
            .data("item.autocomplete", item)
            .append('<a href="javascript:;"><input type="checkbox"' + checked + '/>' + item.label + '</a>')
            .appendTo(ul);
    };
}
$(function () {
    var $this;
    var multiSelectOptions = {
        minLength: 0,
        source: function (request, response) {
            response($.map(data, function (item) {
                return {
                    label: item
                }
            }));
        },
        focus: function () {
            // prevent value inserted on focus
            //$($this).autocomplete("search");
            return false;
        },
        select: function (event, ui) {
            var text = $this.val();
            text = text == null || text == undefined ? "" : text;
            var checked = (text.indexOf(ui.item.value + ', ') > -1 ? 'checked' : '');
            if (checked == 'checked') {
                this.value = this.value.replace(ui.item.value + ', ', '')
            }
            else {
                var terms = split(this.value);
                // remove the current input
                terms.pop();
                // add the selected item
                terms.push(ui.item.value);
                // add placeholder to get the comma-and-space at the end
                terms.push("");
                this.value = terms.join(", ");
            }
            return false;
        },
        open: function () {
           $("ul.ui-menu").width($(this).innerWidth());
        }
    }
    $(document).find('textarea[class*="multiselect-element"]').live('keydown', function () {
        bindAutoComplete($this, multiSelectOptions);
    }).live('focus', function () {
        $this = $(this);
        var text = $this.val();
        bindAutoComplete($this, multiSelectOptions);
        $($this).autocomplete("search");
    })
})

Here is my working fiddle

关于javascript - 使用复选框从 jquery 自动完成中选择多个选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40673329/

相关文章:

javascript - KnockoutJS fromJS 不工作 TypeError : Cannot call method 'fromJS' of undefined

visual-studio-code - VSCODE 中的 WebdriverIO 自动完成

javascript - 具有固定页眉和页脚以及不固定宽度的可滚动正文的 HTML 表格

javascript - php 自动替换链接 css

javascript - 如何使用 JavaScript 代码模块上下文中的 FormData?

javascript - 选择类型为 "h"的最近元素,例如h1、h2 等

javascript - 如何将类添加到传单标记?

javascript - 如果选择自动完成输入,则显示/隐藏 Div

javascript - 使用 javascript 从 struts2 jquery 自动完成器读取选定值

javascript - 如何从除单击的元素之外的所有 li 元素中删除事件类?