chrome setSelectionRange() not work in oninput handler
Solution 1
There are some problems with your code, namely that the parameters passed into the select()
function are wrong: this
will be window
and e
will be undefined. Also, using select()
as a function name within the oninput
attributes causes a problem because select will resolve to the select()
method of the input itself. A better approach is usually to set the event handler in script rather than via an event handler attribute.
However, the problem exists even after correcting these issues. Possibly the input
event fires before the browser has moved the caret in Chrome. A simple workaround would be to use a timer, although this is sub-optimal because there's a possibility the user will be able to input another character before the timer fires.
Demo: http://jsfiddle.net/XXx5r/2/
Code:
<input type="text" oninput="selectText(this)">
<script type="text/javascript">
function selectText(input) {
var s = input.value;
if (s.length) {
window.setTimeout(function() {
input.setSelectionRange(s.length-1, s.length);
}, 0);
}
}
</script>
Solution 2
var $input = document.getElementById('my_id');
$input.onfocus = function () {
$input.setSelectionRange(0, 7);
}
$input.focus();
<input type='text' id='my_id' value="My text for example." />
Solution 3
On Angular for example you can do this:
@ViewChild('input', { static: false }) inputElement: ElementRef;
focus(){
setTimeout(() => {
this.inputElement.nativeElement.focus();
this.inputElement.nativeElement.setSelectionRange(this.valueInput.length, this.valueInput.length);
});
}
bigbug
Updated on June 05, 2022Comments
-
bigbug about 2 years
I'm working with some auto-completion code.
setSelectionRange()
is used to select text been completed inoninput
event handler. It works at least in Firefox 14, but not in Chrome(6, 17).Simplified code snippet demonstrating the problem is like this:
<input type='text' oninput='select()' />
function select(e){ var s = this.value; if (s.length) this.setSelectionRange(s.length-1, s.length); }
I debugged the code in chrome, and it turns out that text has been selected at first right after the
setSelectionRange()
been executed, but the selection disappeared later.If i bind the handler to
onclick
instead ofoninput
, like this:<input type='text' onclick='select()' />
then both browsers work fine.
Can anyone please give me some clue to make selection work in Chrome?
-
bigbug almost 12 yearsThis works. I wonder why most search engines' search suggestion only show candidates in the droplist, but never complete user's input and select the completion. Maybe it has something to do with my problem.
-
jonvuri over 11 yearsThe reason this doesn't work the right way in Chrome (without setting a timeout) is because a Chromium bug that's been active for over three years now: code.google.com/p/chromium/issues/detail?id=32865
-
Senica Gonzalez almost 10 yearsfor over a year, I've revisited a piece of code only to give up when it wouldn't work and move onto other things. Such a simple fix...frustrating though.