【发布时间】:2010-09-06 23:32:04
【问题描述】:
我正在使用 jQuery 并试图找到一种跨浏览器的方法来获取 <textarea>s 和 input 框中插入符号的像素坐标,以便我可以在此位置周围放置一个绝对定位的 div。
有 jQuery 插件吗?或者 JavaScript sn-p 来做到这一点?
【问题讨论】:
标签: javascript jquery cross-browser
我正在使用 jQuery 并试图找到一种跨浏览器的方法来获取 <textarea>s 和 input 框中插入符号的像素坐标,以便我可以在此位置周围放置一个绝对定位的 div。
有 jQuery 插件吗?或者 JavaScript sn-p 来做到这一点?
【问题讨论】:
标签: javascript jquery cross-browser
我已经为meteor-autocomplete 寻找了一个 textarea 插入符号坐标插件,因此我评估了 GitHub 上的所有 8 个插件。到目前为止,获胜者是来自 Component 的textarea-caret-position。
镜子<div> 是在屏幕外创建的,其样式与<textarea> 完全相同。然后,直到插入符号的文本区域的文本被复制到 div 中,并在其后插入 <span>。然后,将 span 的文本内容设置为 textarea 中文本的其余部分,以忠实再现虚假 div 中的换行。
这是唯一能保证处理与换行长线有关的所有边缘情况的方法。 GitHub 也使用它来确定其 @ 用户下拉列表的位置。
【讨论】:
注意:此答案描述了如何获取文本光标/插入符号的字符坐标。要找到像素坐标,您需要进一步扩展它。
首先要记住的是光标可以处于三种状态
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
【讨论】:
textarea 中插入符号的 (x, y) 坐标。除了an issue with IE,它几乎可以完美运行。你能帮忙吗?