我正在为我自己的低级程序执行者创建自动完成功能.我需要在VScode和其他IDE中输入的字母表附近获得自动完成值.但我在调整它的大小方面有问题.我需要在文本区 for each 单词输入单词后得到这个框.

这是我的html代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="http://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
  <script src="http://code.jquery.com/jquery-1.10.2.js"></script>
  <script src="http://code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
  <style>
    .ui-autocomplete {
    width:140px !important;
    top: 50px !important;
}
  </style>
  <script>
 $(function () {
      console.log("hi");
      var availableTags = ["SET","ADD","MUL","SUB","DIV","MOD","LOOP","ENDLOOP","IF","ENDIF","ELSE","ENDELSE","END"];
      function split( val ) {
        return val.split( / \s*/ );
      }
      function extractLast( term ) {
        return split( term ).pop();
      }
   

      $( "#tags" ).bind( "keydown", function( event ) {
            //can also use this to track when user presses SPACE
          if(event.which===32)
                 $('#characterSpan').html($(this).val());
          
          if ( event.keyCode === $.ui.keyCode.TAB &&
              $( this ).data( "autocomplete" ).menu.active ) {
            event.preventDefault();
          }
        }),
        $( "#tags" ).autocomplete({
          minLength: 1,
          source: function( request, response ) {
            response( $.ui.autocomplete.filter(
              availableTags, extractLast( request.term ) ) );
          },
          focus: function() {
            return false;
          },
          select: function( event, ui ) {
            var terms = split( this.value );
            terms.pop();
            terms.push( ui.item.value );
            terms.push( " " );
            this.value = terms.join(" ");
            //when item selected, add current value to span
            //$('#characterSpan').html($(this).val());
            return false;
          },
         open: function( event, ui ) {
              
               $('.ui-autocomplete.ui-menu');
          },
          open: function() {
            var position = window.getSelection().getRangeAt(0).startOffset;
            var cursorPos= $("#tags").prop('selectionStart');
            $("ul.ui-menu").width();
    }
         });
    
});

  </script>
  <title>Document</title>
</head>
<body>
  <div id="menu-container" style="position:absolute; width: 500px;">
    <label for="tags">Tag programming languages: </label>
    <textarea id="tags" rows="20" cols="70"></textarea>
    <span id="characterSpan" style="visibility: hidden;"></span>
  </div>
</body>
</html>

推荐答案

在这些方面:

$(".ui-autocomplete").css("left", getCursorPos($("#tags")[0]) * 7.5 + 7.5 + "px");
$(".ui-autocomplete").css("top", getLineNumber($("#tags")[0]) * 15 + 30 + "px");

我假设7.5px为起始水平位置,7.5px for each 字母的宽度,垂直30px为起始位置,15px for each 字母的高度.我还使用了this answer中的两个函数来获取光标位置

function getLineNumber(tArea) {
        return tArea.value.substr(0, tArea.selectionStart).split("\n").length;
      }

      function getCursorPos(me) {
        var el = $(me).get(0);
        var pos = 0;
        if ("selectionStart" in el) {
          pos = el.selectionStart;
        } else if ("selection" in document) {
          el.focus();
          var Sel = document.selection.createRange();
          var SelLength = document.selection.createRange().text.length;
          Sel.moveStart("character", -el.value.length);
          pos = Sel.text.length - SelLength;
        }
        var ret = pos - prevLine(me);
        return ret;
      }

      function prevLine(me) {
        var lineArr = me.value.substr(0, me.selectionStart).split("\n");

        var numChars = 0;

        for (var i = 0; i < lineArr.length - 1; i++) {
          numChars += lineArr[i].length + 1;
        }

        return numChars;
      }

      $(function () {
        console.log("hi");
        var availableTags = [
          "SET",
          "ADD",
          "MUL",
          "SUB",
          "DIV",
          "MOD",
          "LOOP",
          "ENDLOOP",
          "IF",
          "ENDIF",
          "ELSE",
          "ENDELSE",
          "END",
        ];
        function split(val) {
          return val.split(/ \s*/);
        }
        function extractLast(term) {
          return split(term).pop();
        }

        $("#tags").bind("keydown", function (event) {
          //can also use this to track when user presses SPACE
          if (event.which === 32) $("#characterSpan").html($(this).val());

          if (event.keyCode === $.ui.keyCode.TAB && $(this).data("autocomplete").menu.active) {
            event.preventDefault();
          }
        }),
          $("#tags").autocomplete({
            minLength: 1,
            source: function (request, response) {
              response($.ui.autocomplete.filter(availableTags, extractLast(request.term)));
              $(".ui-autocomplete").css("left", getCursorPos($("#tags")[0]) * 7.5 + 7.5 + "px");
              $(".ui-autocomplete").css("top", getLineNumber($("#tags")[0]) * 15 + 30 + "px");
            },
            focus: function () {
              return false;
            },
            select: function (event, ui) {
              /* var terms = split(this.value);
              terms.pop();
              terms.push(ui.item.value);
              terms.push(" ");
              this.value = terms.join(" "); */
              this.value = this.value + ui.item.value;
              return false;
            },
            open: function (event, ui) {
              $(".ui-autocomplete.ui-menu");
            },
            open: function () {
              var position = window.getSelection().getRangeAt(0).startOffset;
              var cursorPos = $("#tags").prop("selectionStart");
              $("ul.ui-menu").width();
            },
          });
      });
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="http://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css" />
    <script src="http://code.jquery.com/jquery-1.10.2.js"></script>
    <script src="http://code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
    <style>
      .ui-autocomplete {
        width: 140px !important;
        /* top: 50px !important; */
      }
    </style>
    <title>Document</title>
  </head>
  <body>
    <div id="menu-container" style="position: absolute; width: 500px">
      <label for="tags">Tag programming languages: </label>
      <textarea id="tags" rows="20" cols="70"></textarea>
      <span id="characterSpan" style="visibility: hidden"></span>
    </div>
  </body>
</html>

Javascript相关问答推荐

我可以使用CSS有效地实现最大宽度=100%和最大高度=100%,而无需父母有明确的/固定的宽度和高度,替代方法吗?

我开始使用/url?q=使用Cheerio

Chart.js V4切换图表中的每个条,同时每个条下有不同的标签.怎么做?

空的结果抓取网站与Fetch和Cheerio

为什么useState触发具有相同值的呈现

我怎么才能得到Kotlin的密文?

使用原型判断对象是否为类的实例

在HTML语言中调用外部JavaScript文件中的函数

TypeError:无法分解';React2.useContext(...)';的属性';basename';,因为它为空

在我的index.html页面上找不到我的Java脚本条形图

将数组扩展到对象中

为什么我的按钮没有从&q;1更改为&q;X&q;?

使用类型:assets资源 /资源&时,webpack的配置对象&无效

打字脚本中方括号符号属性访问和拾取实用程序的区别

警告框不显示包含HTML输入字段的总和

在Vercel中部署Next.js项目时获取`ReferenceError:未定义文档`

在JavaScript中将Base64转换为JSON

是否设置以JavaScript为背景的画布元素?

JQuery使用选项填充HTMLSELECT并设置默认结果,默认结果显示为空

如何格式化API的响应