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