Select2 中的标记分隔符

Posted

技术标签:

【中文标题】Select2 中的标记分隔符【英文标题】:tokenSeparators in Select2 【发布时间】:2015-08-12 15:48:34 【问题描述】:

提前致谢,有两件事:

1- 如何在 Select2 中将“Enter”和“Tab”键作为标记?

这是我的一些代码。

            $("#ListaValores").val($("#ListaValores").val().replace(/\;/g,','))
        $("#ListaValores").select2(
            tags: true,
            tokenSeparators: [';'],
            maximumResultsForSearch: -1,
            dropdownCss: display:'none',
        );

第一行只是转换输入,以便 Select2 可以使用数据。

原始输入可以是这样的:

$("#ListaValores").val("value1;value2;value3")

这些值存储在 db 中并加载到文本框,然后转换为 select2。

一切都按预期工作,但我想改造这部分:

tokenSeparators: [';']

所以它也接受“Enter”和“Tab”键作为令牌。

有人可以帮忙吗?我尝试了 ASCII 码,但没有成功。

2- 另外,是否有任何标签可以禁用微调器图像? (由于没有加载数据,我真的不需要出现加载图像)

更新 2:

我在这方面取得了一些成功:

$("#s2id_ListaValores").on('keyup', function(e) 
            if(e.keyCode === 13)
                $("#ListaValores").val($("#ListaValores").val() + ';' + $("#s2id_autogen1").val())
            
        );

但是 $("#s2id_autogen1").val() 不是静态的并且总是在变化,所以这种工作一次......另外,我仍然需要更新显示的结果。我可以在 select2 div 上使用“刷新”来做到这一点,但随后 div 会更改它的 id,并且 $("#s2id_ListaValores").on('keyup', function(e) 事件将不起作用。

【问题讨论】:

如果您设置多个和标签以允许使用某些值,则 Enter 会自动用作标记分隔符:. 在 github 的 select2 repo 上有一个 open issue 来添加这个功能:现在,你不能。 正如我之前所说,我设法解决了这个问题。在我留下的代码中,您只需要包含一个正则表达式即可自动处理 id 更改。 【参考方案1】:

我通过递归函数解决了这个问题:

//init select2 field:
initMultiSelect(tSel);

function initMultiSelect(tSel) 
        tSel.select2('destroy');
        tSel.select2(
            tags: true,
            tokenSeparators: [',', ' ', ';'],
            dropdownCss: display:'none'
        );

        //manual add new values by Enter
        (function (t) 
            $('#s2id_' + t.attr('id')).on('keyup', function(e) 
                if(e.keyCode === 13)
                    //add new value
                    t.val(t.val() + ',' + $('#s2id_' + t.attr('id') + ' input ').val());

                    //refresh select2
                    initMultiSelect(t);

                    //get focus to select2 last position
                    t.select2("close");
                    t.select2("open");
                
            );
        )(tSel);
    

【讨论】:

欢迎来到 Stack Overflow!虽然这段代码 sn-p 可以解决问题,包括说明 如何为什么 这解决了问题would really help 以提高您的帖子质量。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人!请edit您的答案添加解释,并说明适用的限制和假设。 这个答案与我在原始帖子中的更新使用了相同的想法。只是使用正则表达式的替代方法。【参考方案2】:

目前,在粘贴时,这在当前版本的 select2 中是不可能的,因为它使用 input type="text" 作为输入字段,并且在粘贴时浏览器会去除换行符。

为了完成这项工作,需要对 select2 进行修补以改用 textarea。我打开了一个拉取请求来完成此操作,您可以在此处查看:https://github.com/select2/select2/pull/4795 如果/当我的拉取请求被合并时,您应该能够使用指定的字符作为令牌分隔符,但在此之前,您可以下载我的如果您愿意,可以使用 fork 来解决您的问题。

【讨论】:

【参考方案3】:

尝试使用以下作为“enter”和“tab”键的标记分隔符。

tokenSeparators: [';', '\n', '\t']

“enter”键通常会触发 Select2 的选择,但换行符(不同程序中的“enter”键)不会。您可以使用 \n 向 Select2 指示这些也应被视为分隔符。

相同的选项出现在 tab 键上,它通常应该选择当前突出显示的值,并在从另一个源加载时使用 \t 作为分隔符。

请记住,这种差异仅在您粘贴需要标记化的数据时才真正重要,因为 Select2 具有这两个键的绑定,它们已经自动标记化它们。您可能需要启用 tags 才能做到这一点。

【讨论】:

\n - 工作,但我在 Ubuntu 上测试,Windows 呢?

以上是关于Select2 中的标记分隔符的主要内容,如果未能解决你的问题,请参考以下文章

使用分隔符搜索 varchar 列中的每个标记 [关闭]

VScode 标记“&&”不是此版本中的有效语句分隔符。

是否可以更改选择字段中的输入?

boost::tokenizer 考虑分隔符之间没有标记

vscode运行命令是报错:标记“&&”不是此版本中的有效语句分隔符。

保留字符串中的分隔标记列表[关闭]