使用不可见的人造元素
您可以通过使用绝对定位的不可见(使用visibility
not display
)虚假元素来实现这一点,该元素具有与输入文本框(字体、左边框和左填充)相同的所有 CSS 属性。
这个非常简短且易于理解的 JSFiddle是该脚本应该如何工作的起点。
它可以在 Chrome 和 Firefox 中按原样运行。它似乎也应该在 IE9+ 中工作。
Internet Explorer 8(及以下)需要一些额外的代码才能从输入文本框中的文本开头获取插入符号的位置。我什至在顶部添加了一个仪表,以每 10 个像素显示一条线,以便您查看它是否正确测量。请注意,线条位于 1、11、21、... 像素位置。
这个例子实际上是把文本框中的所有文本放到插入符号的位置,然后把它放在人造元素内,然后测量它的宽度(以像素为单位)。这使您从文本框的左侧偏移。
当它将文本复制到人造元素时,它还会用不间断的空格替换普通空格,因此它们实际上会被渲染,否则如果您将插入符号放置在空格之后,您会得到错误的位置:
var faux = $("#faux");
$("#test").on("keyup click focus", function(evt) {
// get caret offset from start
var off = this.selectionStart;
// replace spaces with non-breaking space
faux.text(this.value.substring(0, off).replace(/\s/g, "\u00a0"));
});
注意人造的正确尺寸
已被删除以获得正确的值,否则元素会太宽。元素的框必须在它包含的文本之后结束。
Caret 从输入框开始的像素位置可以很容易地从以下位置获得:
faux.outerWidth();
问题
不过有一个问题。我不确定如何处理文本框中的文本滚动(太长时)并且插入符号不在文本的最后但介于两者之间的情况...如果它在末尾,则插入符号位置始终在可能的最大位置(输入宽度减去右侧尺寸 - 填充、边框、边距)。
我不确定是否可以在文本框中获取文本滚动位置?如果可以,那么即使这个问题也可以解决。但我不知道有任何解决方案...
希望这可以帮助。