Textarea Caret Position
Get the top and left coordinates of the caret in a or
, in pixels. Useful for textarea autocompletes like
GitHub or Twitter, or for single-line autocompletes like the name drop-down
in Twitter or Facebook's search or the company dropdown on Google Finance.
How it's done: a faux Check out the JSFiddle
or the test.html. The function returns a caret coordinates object of the form None. For the same textarea of 25 rows and 40 columns, Chrome 33, Firefox 27 and IE9 returned completely different values
for Chrome 33 IE 9: scrollbar looks 16px, the text itself in the text area is 224px wide Firefox 27textarea or input. Then, the text of the element up to the caret is copied
into the div and a is inserted right after it. Then, the text content
of the span is set to the remainder of the text in the , in order to
faithfully reproduce the wrapping in the faux div (because wrapping can push
the currently typed word onto the next line). The same is done for the
input to simplify the code, though it makes no difference. Finally, the span's
offset within the textarea or input is returned.
Demo
Features
s and elementsExample
document.querySelector('textarea').addEventListener('input', function () {
var caret = getCaretCoordinates(this, this.selectionEnd);
console.log('(top, left, height) = (%s, %s, %s)', caret.top, caret.left, caret.height);
})API
getCaretCoordinates(element, position)
element is the DOM element, either an or textareaposition is an integer indicating the location of the caret. Most often you'll want to pass this.selectionStart or this.selectionEnd. This way, the library isn't opinionated about what the caret is.{top: , left: , height: }, where:
top and left are the offsets in pixels from the upper-left corner of the element and (or presumably the upper-right, but this hasn't been tested), andheight is the height of the caret - useful to calculate the bottom of the caret.Known issues
s (#29). This may be a bug in how browsers render the caret. (#40). The caret position can be quite off in this case.s aren't supported in IE9 (#14)Dependencies
TODO
Test IE8 support with .currentStyleImplementation notes
computed.width, textarea.offsetWidth, and textarea.clientWidth. Here, computed is getComputedStyle(textarea):
computed.width : "240px" = the text itself, no borders, no padding, no scrollbarstextarea.clientWidth: 280 = computed.width + padding-left + padding-righttextarea.offsetWidth: 327 = clientWidth + scrollbar (15px) + border-left + border-right
computed.width: "241.37px" = text only + sub-pixel scrollbar? (1.37px)textarea.clientWidth: 264textarea.offsetWidth: 313
computed.width: "265.667px"textarea.clientWidth: 249 - the only browser where textarea.clientWidth < computed.widthtextarea.offsetWidth: 338Contributors