如何从自动完成建议中接收关键字,而不在 jQuery UI 的末尾添加逗号?

Posted

技术标签:

【中文标题】如何从自动完成建议中接收关键字,而不在 jQuery UI 的末尾添加逗号?【英文标题】:How to receive keywords from auto complete suggestions without a comma added to the end in jQuery UI? 【发布时间】:2020-03-04 12:32:24 【问题描述】:

当用户在content editable div 中键入内容时,我想包含autocomplete 的功能。每次他输入一个新词来构造句子时,他应该总是得到建议。所以我找到了满足我需求的jquery UI

这是显示它工作的 jsfiddle http://jsfiddle.net/8ky5um7n/

现在的问题是,每次用户收到autocomplete 建议并选择一个时,该值都会添加到文本中,但后面会出现comma。所以基本上文本最终看起来像一个逗号分隔的值。

现在我要做的是从auto complete 列表中删除添加到每个选择中的comma,使其看起来像一个句子而不是逗号分隔的列表。

所以在查看代码后,我发现这段代码在所选单词的末尾添加了comma

select: function (event, ui) 

                var value = $(this).html();
                var terms = split(value);
                terms.pop();
                terms.push(ui.item.value);
                $(this).html(terms+", ");
                placeCaretAtEnd(this);

            return false;
        

如您所见,这段代码$(this).html(terms+", ");最后添加了一个comma。所以就修改成这个

$(this).html(terms);  // I want just the term. So when user receives it, he presses space and next autocomplete suggestion is expected

它在没有comma 的情况下返回结果,但随后,它不再建议句子中的下一个单词。

我做错了什么?

【问题讨论】:

您的小提琴似乎不起作用,我在控制台中看到 2 个错误。 TypeError: $(...).bind(...).autocomplete is not a function _display:102:8TypeError: $.ui is undefined 5 _display:97:13 您想用什么作为分隔符?我猜既然你想造一个句子,你就想用空格" "。目前,您的代码使用逗号",",以便它可以更轻松地创建一个数组然后操作该数组。 在进行一些测试时,当您选择第一项,然后开始输入第二个单词时,某些东西正在删除两个单词之间的空格,导致它尝试和过滤不正确。进一步测试。 【参考方案1】:

在您的 split 函数中,您可以设置分隔符,例如,如果您想更改为分号;你可以写:

function split( val ) 
  return val.split( /;\s*/ );

然后您将 html 插入更改为:

$(this).html(terms.join(" ") + "; ");

http://jsfiddle.net/jzn4Lvek/

【讨论】:

【参考方案2】:

考虑使用  作为分隔符而不是,。例如:

https://jsfiddle.net/Twisty/0omdux5h/

JavaScript

$(function() 
  var availableTags = [
    "ActionScript",
    "AppleScript",
    "Asp",
    "BASIC",
    "C",
    "C++",
    "Clojure",
    "COBOL",
    "ColdFusion",
    "Erlang",
    "Fortran",
    "Groovy",
    "Haskell",
    "Java",
    "javascript",
    "Lisp",
    "Perl",
    "php",
    "Python",
    "Ruby",
    "Scala",
    "Scheme"
  ];


  function placeCaretAtEnd(el) 
    el.focus();
    if (typeof window.getSelection != "undefined" &&
      typeof document.createRange != "undefined") 
      var range = document.createRange();
      range.selectNodeContents(el);
      range.collapse(false);
      var sel = window.getSelection();
      sel.removeAllRanges();
      sel.addRange(range);
     else if (typeof document.body.createTextRange != "undefined") 
      var textRange = document.body.createTextRange();
      textRange.moveToElementText(el);
      textRange.collapse(false);
      textRange.select();
    
  


  function split(val) 
    return val.split(" ");
  

  function extractLast(term) 
    return split(term).pop();
  

  $("#tags")
    .bind("keydown", function(event) 
      if (event.keyCode === $.ui.keyCode.TAB &&
        $(this).data("ui-autocomplete").menu.active) 
        event.preventDefault();
      
    )
    .autocomplete(
      minLength: 0,
      source: function(request, response) 
        var that = $("#tags");
        response($.ui.autocomplete.filter(
          availableTags, extractLast(that.html())));
      ,
      focus: function() 
        return false;
      ,
      select: function(event, ui) 
        var terms = split($(this).html());
        terms.pop();
        terms.push(ui.item.value);
        var str = terms.join(" ");
        $(this).html(str + " ");
        placeCaretAtEnd(this);
        return false;
      
    );
);

这会在 HTML 中呈现为 Non-Breaking Space,并且与您的光标功能配合使用会更好。我发现无论如何,新文本的输入都会导致空间下降。从功能上讲,这应该不是问题。如果您将数据保存在某个地方,我会通过替换函数运行它并将它们转换回空格,因为它们是不同的字符。

function nbsp2Space(val)
  return val.replace(" ", " ");

【讨论】:

您的 jsfiddle 似乎不起作用。我输入字母时没有收到任何建议。 好的,当我复制你的代码并粘贴到一个新的小提琴中时,它给出了第一个单词的建议,但没有给出下一个单词。【参考方案3】:

我解决了。 @Peter 的解决方案很接近。所以我不得不在两个地方换。首先必须将split 函数更改为

function split( val ) 
      return val.split( / \s*/ );  //notice the (space) that I provided
    

其次,我必须将 html 插入更改为此

$(this).html(terms.join(" ") + "");

现在用户输入一个字母,获得建议,选择它,点击空格,输入第二个字母,获得建议等等。

【讨论】:

以上是关于如何从自动完成建议中接收关键字,而不在 jQuery UI 的末尾添加逗号?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Atom 编辑器自动完成中删除特定建议

从自动完成列表提交查询,而无需点击提交按钮

如何使用 Selenium 从亚马逊上的自动建议中“点击”某些建议?

如何使对象在特定关键帧处不可见而不在 Blender (2.59) 中移动它?

Swift中的自动完成搜索列表问题

如何使 IntelliJ 自动完成不在 Javadoc 中插入完整路径