【问题标题】:How do I get the (x, y) pixel coordinates of the caret in text boxes?如何获取文本框中插入符号的 (x, y) 像素坐标?
【发布时间】:2010-09-06 23:32:04
【问题描述】:

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

有 jQuery 插件吗?或者 JavaScript sn-p 来做到这一点?

【问题讨论】:

    标签: javascript jquery cross-browser


    【解决方案1】:

    我已经为meteor-autocomplete 寻找了一个 textarea 插入符号坐标插件,因此我评估了 GitHub 上的所有 8 个插件。到目前为止,获胜者是来自 Componenttextarea-caret-position

    特点

    • 像素精度
    • 没有任何依赖关系
    • 浏览器兼容性:Chrome、Safari、Firefox(尽管有twobugs)、IE9+;可以工作,但未在 Opera、IE8 或更早版本中测试
    • 支持任何字体系列和大小,以及文本转换
    • 文本区域可以有任意填充或边框
    • 不会被文本区域中的水平或垂直滚动​​条弄糊涂
    • 支持硬回车、制表符(IE 除外)和文本中的连续空格
    • 比文本区域中的列长的行的正确位置
    • 长字换行时,在行尾没有"ghost" position in the empty space

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

    工作原理

    镜子<div> 是在屏幕外创建的,其样式与<textarea> 完全相同。然后,直到插入符号的文本区域的文本被复制到 div 中,并在其后插入 <span>。然后,将 span 的文本内容设置为 textarea 中文本的其余部分,以忠实再现虚假 div 中的换行。

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

    【讨论】:

    • 我刚刚注意到,在“ranodm”文本之间,有 Carly Rae Jepsen 的歌曲歌词 - Call Me Maybe (youtube.com/watch?v=fWNaR-rxAic)。但是很好的建议!但是,它在最近的 Chrome 版本中有一个错误。您选择从一行的开头到中间。然后单击该行的开头。红线不会移动。
    • @IsmaelMiguel - 很高兴你注意到这首歌 :) 至于问题,你能file it on GitHub吗?谢谢!
    • 我现在才注意到。我拼错了 random :/ 还有更多坏消息:IE11 上的幽灵选择又回来了。
    • 对我不起作用,我刚刚打开了演示 jsfiddle,单击中间某处,插入符号似乎偏离了 1 行
    【解决方案2】:

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

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

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

    IE 模型使用对象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;
    }
    

    Bug 注意:链接在顶部没有正确标记。

    选择对象: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 团队开发了 a plugin 来计算 textarea 中插入符号的 (x, y) 坐标。除了an issue with IE,它几乎可以完美运行。你能帮忙吗?
    猜你喜欢
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多