根据鼠标在输入字段中的移动查找字符位置

时间:2018-12-05 23:46:15

标签: javascript jquery html css

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

  

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

我确实发现了一些与selectionStart等一起使用的示例,但是它们仅在将插入号放置在某个位置然后找到放置位置时才起作用。

我要寻找的是-不管鼠标何时在字符上移动,都可以在输入字段中单击或不单击鼠标-我能够知道鼠标悬停在字符上的位置。

我还没有想到如何将鼠标坐标分别转换为字符位置。是否有任何此类JavaScript API?

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

更新

我的最终目标是在可编辑内容的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/

1 个答案:

答案 0 :(得分: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)
})
<input id="showpos" />

希望这些想法对您有帮助

瑞秋