Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何获取文本框中插入符号的(x,y)像素坐标?_Javascript_Jquery_Cross Browser - Fatal编程技术网

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

Javascript 如何获取文本框中插入符号的(x,y)像素坐标?,javascript,jquery,cross-browser,Javascript,Jquery,Cross Browser,我正在使用jQuery并试图找到一种跨浏览器的方法来获取s和输入框中插入符号的像素坐标,这样我就可以在这个位置周围放置一个绝对定位的div 有jQuery插件吗?或者JavaScript代码片段就可以做到这一点吗?我不认为每个浏览器都可以做到这一点。有人在IE6中做过,但在FF或Opera(AFAIK)中不起作用。也许你可以让它在所有的浏览器中工作 .注意:此答案描述了如何获取文本光标/插入符号的字符坐标。要找到像素坐标,需要进一步扩展 首先要记住的是光标可以处于三种状态 位于特定位置的常规插

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


有jQuery插件吗?或者JavaScript代码片段就可以做到这一点吗?

我不认为每个浏览器都可以做到这一点。有人在IE6中做过,但在FF或Opera(AFAIK)中不起作用。也许你可以让它在所有的浏览器中工作


.

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

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

  • 位于特定位置的常规插入光标
  • 具有特定边界区域的文本选择
  • 未激活:textarea没有焦点。尚未使用
IE模型使用对象,从中我们可以得到一个对象,该对象使我们能够访问选择,从而访问光标位置

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;
}
错误提示:链接未在顶部段落中正确标记

选择对象:

TextRange对象:

我已经为寻找textarea插入符号坐标插件,所以我评估了GitHub上的所有8个插件。到目前为止,赢家是来自组件的

特征
  • 像素精度
  • 没有任何依赖关系
  • 浏览器兼容性:Chrome、Safari、Firefox(尽管有)、IE9+;可能有效,但未在Opera、IE8或更高版本中测试
  • 支持任何字体系列和大小,以及文本转换
  • 文本区域可以有任意的填充或边框
  • 不会被文本区域中的水平或垂直滚动条所混淆
  • 支持硬回车、制表符(IE上除外)和文本中的连续空格
  • 文本区域中比列长的行上的正确位置
  • 当包装长单词时,在一行的末尾没有
这是一个演示-

工作原理 镜像
在屏幕外创建,样式与
完全相同。然后,直到插入符号的文本区域的文本被复制到div中,并在其后面插入一个
。然后,将跨度的文本内容设置为textarea中文本的其余部分,以便忠实地在faux div中复制包装


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

我开始在所有现代浏览器中工作。Component.io团队已开发用于计算
文本区域中插入符号的(x,y)坐标。它几乎完美地工作,除了。你能帮忙吗?我刚刚注意到在“ranodm”文本之间,你有Carly Rae Jepsen的歌的歌词-也许叫我()。但是很好的建议!然而,它在最近的Chrome版本上有一个bug。从线的起点到中间进行选择。然后你点击这条线的边缘。红线不会移动。@IsmaelMiguel-很高兴你注意到这首歌:)至于这个问题,你能不能?谢谢我现在才注意到。我拼错了random:/我还有一个坏消息:ghost selection又回到了IE11上。对我来说不起作用,我只是打开了演示JSFIDLE,点击中间的某个地方,插入符号似乎偏离了1行PAT,你接受的答案只有一个死链接。@JDB谢谢,接受了更新的最新答案:)