【问题标题】:Find character position based on mouse move in a input field根据输入字段中的鼠标移动查找字符位置
【发布时间】:2018-12-05 23:46:14
【问题描述】:

我需要根据鼠标移动在输入字段中找到字符的位置

例如:如果输入字段的值为“abcde”并且我正在移动我的 将鼠标放在字符“a”上,则位置将为 1,“b”将为其他字符提供 2,依此类推。

我确实找到了一些适用于 selectionStart 等的示例,但它们仅在插入符号放置在某个位置然后找到放置的位置时才有效。

我正在寻找的是 - 无论鼠标何时在字符上移动,在输入字段中可能/可能不会点击完成 - 我能够知道鼠标悬停的字符的位置。

我不知道如何将鼠标坐标分别转换为字符位置。有没有这样的javascript API?

非常感谢任何帮助/指针/想法。

更新

我的最终目标是在 contenteditable div 上发生拖动时自动移动插入符号。我找到了一个询问类似问题的以下链接 - 但到目前为止还没有建议的解决方案。

caret auto move - https://stackoverflow.com/questions/12397792/update-caret-position-of-input-and-insert-text-on-drop-event/53660415#53660415

我还添加了另一个示例来展示原生拖动与 jQuery 拖动的不同行为。我正在使用不支持插入符号自动拖动的 jQuery draggable。

https://jsfiddle.net/VidushiGupta/7warczfy/

【问题讨论】:

  • 显然您可以通过在文本节点上注册也许处理程序来获取鼠标指针位置,但您可能无法获得单个字符的确切位置,因为并非所有字符的大小都相同。例如字符liw 具有不同的宽度。
  • 我认为没有什么可以直接满足您的需求,因为您将只使用一个文本节点。您可以将每个字符的文本分解为span(或其他内联标记),并控制mouseentermouseleave,但这听起来过于复杂(而且可能太昂贵,特别是如果它是一个长文本)。也许如果您使用等宽字体,您可以通过获取容器内的鼠标坐标来计算位置。
  • 请添加您到目前为止尝试过的内容

标签: javascript jquery html css


【解决方案1】:

Jquery: 你可以试试Caret plugin(不过我不确定这是否满足你的需求)你可以阅读jquery page,但不是很内容丰富!

Javascript 解决方案:

我环顾四周寻找预先存在的解决方案,但关于悬停/鼠标悬停,我发现只有一个潜在的适应性解决方案。这段代码不是我的,它改编自 Carlos Delgado 找到的公共小提琴(我进行了改编,以便如果您将鼠标悬停在“显示位置”文本上,它将显示光标位置)。它还演示了selectionStartselectionEnd 的使用,因此如果选择了文本,则会显示开始和结束位置。如果您使用箭头键向前或向后移动光标,然后再次悬停,将显示更新的光标位置。

另外,here's a shorter [alternative] version (without the start/end etc)

function getInputSelection(el) {
  var start = 0,
    end = 0,
    normalizedValue, range,
    textInputRange, len, endRange;

  if (typeof el.selectionStart == "number" && typeof el.selectionEnd == "number") {
    start = el.selectionStart;
    end = el.selectionEnd;
  } else {
    range = document.selection.createRange();

    if (range && range.parentElement() == el) {
      len = el.value.length;
      normalizedValue = el.value.replace(/\r\n/g, "\n");

      // Create a working TextRange that lives only in the input
      textInputRange = el.createTextRange();
      textInputRange.moveToBookmark(range.getBookmark());

      // Check if the start and end of the selection are at the very end
      // of the input, since moveStart/moveEnd doesn't return what we want
      // in those cases
      endRange = el.createTextRange();
      endRange.collapse(false);

      if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
        start = end = len;
      } else {
        start = -textInputRange.moveStart("character", -len);
        start += normalizedValue.slice(0, start).split("\n").length - 1;

        if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) {
          end = len;
        } else {
          end = -textInputRange.moveEnd("character", -len);
          end += normalizedValue.slice(0, end).split("\n").length - 1;
        }
      }
    }
  }

  return {
    start: start,
    end: end
  };
}

document.getElementById("trigger").addEventListener("mouseover", function() {
  var input = document.getElementById("texto");
  var inputContent = input.value.length;
  // You may want to focus the textbox in case it's not
  input.focus();
  var result = getInputSelection(input);
  var resultSpan = document.getElementById("result");

  if (result.start == result.end) {
    resultSpan.innerHTML = "No text selected. Position of cursor is " + result.start + " of " + inputContent;
  } else {
    resultSpan.innerHTML = "You've selected text (" + result.start + " to " + result.end + ") from a total length of " + inputContent;
  }

}, false);
#trigger{background:#ff8890;}
<p>
  Get the cursor position in a textarea or a text input or the selected text.
</p><br>
<textarea id="texto"></textarea><br><br>
<input type="text" id="trigger" value="Show Position" size="10" /><br><br>
<span id="result"></span>

This solution 也可以工作:它显示控制台中的位置(也许这样更可取?)。如果需要,您可以调整它。

document.getElementById('showpos').addEventListener('mouseenter', e => {
  console.log('Caret at: ', e.target.selectionStart)
})
&lt;input id="showpos" /&gt;

希望这些想法对您有所帮助

雷切尔

【讨论】:

  • 感谢您的帮助 - 但这仍然不能解决我的担忧。
  • 第一个提到的解决方案从文本框中选择插入符号的位置。我正在寻找的用例是当字符悬停时,有一种方法可以找到位置。例如插入符号可能放在字符串“abcde”的末尾,但鼠标悬停在“b”上,我能够得到位置 2。
  • @VidushiGupta 您是否尝试过其他答案?它们并不完全相同。
  • 我需要这样做的原因是为了实现原生 HTML 可拖动支持的功能,当您移动拖动的项目时 - 相应的插入符号会随之移动。这在 jQuery 可拖动库中是缺失的 - 因此我试图达到同样的效果。在 https://jsfiddle.net/VidushiGupta/7warczfy/ 有两个例子。我有可以将插入符号设置在特定位置的方法 - 但是当我移动拖动的元素时我需要知道位置。
  • 我已经尝试用谷歌搜索并试图找到任何指针,这甚至可以让我开始并给出想法 - 但还没有遇到任何事情:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 2019-01-04
相关资源
最近更新 更多