单击内容可编辑区域时启用自动完成下拉菜单

Posted

技术标签:

【中文标题】单击内容可编辑区域时启用自动完成下拉菜单【英文标题】:Enable autocomplete dropdown when clicked on the contenteditable area 【发布时间】:2019-05-25 18:29:24 【问题描述】:

有一个包含一些数据的 contenteditable span 标签。当我编辑跨度标记中存在的数据时,我需要清除完整的数据,然后我从自动完成列表中获得建议。我需要的是,我想在用户单击 span 标签而不编辑任何预先存在的数据时显示数据。请帮帮我。先感谢您。

【问题讨论】:

欢迎来到 Stack Overflow。请参加游览:***.com/tour 您还需要提供一个最小、完整且可验证的示例:***.com/help/mcve 【参考方案1】:

这是一个基于http://jqueryui.com/autocomplete/#multiple的非常简单的例子

$(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 split(val) 
    return val.split(" ");
  

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

  function moveCursorToEnd(el) 
    if (typeof el.selectionStart == "number") 
      el.selectionStart = el.selectionEnd = el.value.length;
     else if (typeof el.createTextRange != "undefined") 
      el.focus();
      var range = el.createTextRange();
      range.collapse(false);
      range.select();
    
  

  $("#content")
    // don't navigate away from the field on tab when selecting an item
    .on("keydown", function(event) 
      if (event.keyCode === $.ui.keyCode.TAB &&
        $(this).autocomplete("instance").menu.active) 
        event.preventDefault();
      
    )
    .autocomplete(
      minLength: 0,
      source: function(request, response) 
        // delegate back to autocomplete, but extract the last term
        response($.ui.autocomplete.filter(
          availableTags, extractLast(request.term)));
      ,
      focus: function() 
        // prevent value inserted on focus
        return false;
      ,
      select: function(event, ui) 
        var val = $(this).html();
        var terms = split(val);
        // 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).html(terms.join(" "));
        moveCursorToEnd($(this)[0]);
        return false;
      
    );
);
#content 
  min-width: 1em;
  min-height: 1em;
  border: 1px solid #eee;
  border-radius: 3px;
  padding-left: 1px;
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<div class="ui-widget">
  <label for="content">Edit content: </label>
  <span id="content" contenteditable="true">Basic</span>
</div>

如您所见,它已被修改为使用“”(空格)而不是“,”进行拆分和连接。假设您正在创建句子或单词列表,这将非常有效。

希望对您有所帮助。

【讨论】:

这很有帮助。非常感谢。

以上是关于单击内容可编辑区域时启用自动完成下拉菜单的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MVC 剑道树列表编辑器中实现剑道自动完成下拉菜单

React/Material UI - Google Places 自动完成下拉菜单有时不起作用

每个单词下方的jQuery-ui自动完成下拉菜单

Toad 自动完成下拉菜单

PrimeNg Angular2 自动完成 清除所有

MVC5中的自动完成下拉菜单?