我正在使用 jQuery 并试图找到一种跨浏览器的方式来获取<textarea>
s 和input
box 中插入符号的像素坐标,以便我可以在这个位置周围放置一个绝对定位的 div。
是否有一些 jQuery 插件?或者 JavaScript 片段来做到这一点?
我正在使用 jQuery 并试图找到一种跨浏览器的方式来获取<textarea>
s 和input
box 中插入符号的像素坐标,以便我可以在这个位置周围放置一个绝对定位的 div。
是否有一些 jQuery 插件?或者 JavaScript 片段来做到这一点?
我已经寻找了用于meteor-autocomplete的textarea caret 坐标插件,所以我已经评估了GitHub 上的所有8 个插件。到目前为止,获胜者是来自Component 的textarea-caret-position。
镜子<div>
是在屏幕外创建的,其样式与<textarea>
. 然后,直到插入符号的 textarea 的文本被复制到 div 中,并<span>
在它之后插入a 。然后,将span的文本内容设置为textarea中文本的剩余部分,以忠实地再现仿div中的换行。
这是保证处理所有与长行换行有关的边缘情况的唯一方法。GitHub 也使用它来确定其@user下拉列表的位置。
注意:此答案描述了如何获取文本光标/插入符号的字符坐标。要找到像素坐标,您需要进一步扩展它。
首先要记住的是光标可以处于三种状态
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