如何获得文本框中插入符号的 (x, y) 像素坐标?

IT技术 javascript jquery cross-browser
2021-01-17 17:46:36

我正在使用 jQuery 并试图找到一种跨浏览器的方式来获取<textarea>s 和inputbox 中插入符号的像素坐标,以便我可以在这个位置周围放置一个绝对定位的 div。

是否有一些 jQuery 插件?或者 JavaScript 片段来做到这一点?

2个回答

我已经寻找了用于meteor-autocomplete的textarea caret 坐标插件,所以我已经评估了GitHub 上的所有8 个插件。到目前为止,获胜者是来自Component 的textarea-caret-position

特征

  • 像素精度
  • 没有任何依赖
  • 浏览器兼容性:Chrome、Safari、Firefox(尽管有两个 错误)、IE9+;可以工作,但未在 Opera、IE8 或更早版本中测试
  • 支持任何字体系列和大小,以及文本转换
  • 文本区域可以有任意填充或边框
  • 不会被 textarea 中的水平或垂直滚动​​条混淆
  • 支持硬回车、制表符(IE 除外)和文本中的连续空格
  • 比文本区域中的列长的行上的正确位置
  • 换行长单词时,行尾空白处没有“幽灵”位置

这是一个演示 - http://jsfiddle.net/dandv/aFPA7/

在此处输入图片说明

怎么运行的

镜子<div>是在屏幕外创建的,其样式与<textarea>. 然后,直到插入符号的 textarea 的文本被复制到 div 中,并<span>在它之后插入a 然后,将span的文本内容设置为textarea中文本的剩余部分,以忠实地再现仿div中的换行。

这是保证处理所有与长行换行有关的边缘情况的唯一方法。GitHub 也使用它来确定其@user下拉列表的位置

对我不起作用,我刚打开演示 jsfiddle,单击中间的某处,插入符号似乎偏离了 1 行
2021-03-15 17:46:36
@IsmaelMiguel - 很高兴你注意到这首歌 :) 至于这个问题,你能把它归档到 GitHub 上吗?谢谢!
2021-03-19 17:46:36
我刚刚注意到在“ranodm”文本之间,你有 Carly Rae Jepsen 的歌词 - Call Me Maybe ( youtube.com/watch?v=fWNaR-rxAic )。但是很好的建议!但是,它在最近的 Chrome 版本上有一个错误。您可以从一行的开头到中间进行选择。然后单击该行的开头。红线不会动。
2021-03-27 17:46:36
我现在才注意到。我拼错了 random :/ 而且我还有更多坏消息:幽灵选择又回到了 IE11 上。
2021-04-10 17:46:36

注意:此答案描述了如何获取文本光标/插入符号字符坐标要找到像素坐标,您需要进一步扩展它。

首先要记住的是光标可以处于三种状态

  • 在特定位置的常规插入光标
  • 具有特定边界区域的文本选择
  • 不活动:textarea 没有焦点。没有被使用过。

IE 模型使用 Object document.selection,从中我们可以获得一个TextRange对象,它使我们能够访问选择,从而访问光标位置。

FF 模型/Opera 使用方便的变量 [input].selectionStart 和 selectionEnd。

两种模型都将常规光标表示为零宽度选择,左边界是光标位置。

如果输入字段没有焦点,您可能会发现两者都没有设置。我使用以下代码成功地在当前光标位置插入了一段文本,还替换了当前选择(如果存在)。取决于确切的浏览器,YMMV。

function insertAtCursor(myField, myValue) {

/* selecion model - ie */
if (document.selection) {
  myField.focus();
  sel = document.selection.createRange();
  sel.text = myValue;
}

/* field.selectionstart/end  firefox */ 
else if (myField.selectionStart || myField.selectionStart == '0' ) {

  var startPos = myField.selectionStart;
  var endPos = myField.selectionEnd;
  myField.value = myField.value.substring(0, startPos)
    + myValue
    + myField.value.substring(endPos, myField.value.length);

  myField.selectionStart = startPos + myValue.length;
  myField.selectionEnd = startPos + myValue.length;
  myField.focus();
} 

// cursor not active/present
else {
  myField.value += myValue;
}

错误注意:链接在顶部段落中没有正确标记。

选择对象:http : //msdn.microsoft.com/en-us/library/ms535869(
VS.85) .aspx TextRange 对象:http : //msdn.microsoft.com/en-us/library/ms535872( VS . 85).aspx

Component.io团队开发一个插件来计算的了(X,Y)的插入符的坐标textarea它几乎完美运行,除了IE 的问题你能帮忙吗?
2021-03-19 17:46:36