I was having a similar problem with scrolling to a selection within a textarea in FireFox. I couldn't send a 'space' then a 'backspace' character because that would overwrite the selection in the textarea. So I found a better way which was to virtually retype the character immediately after the selection which would force the selection to be visible.
Here is the code:
function setSelRange(inputEl, selStart, selEnd) {
if (inputEl.createTextRange) {
var range = inputEl.createTextRange();
range.collapse(true);
range.moveEnd('character', selEnd);
range.moveStart('character', selStart);
range.select();
//range.scrollIntoView();
} else if (inputEl.setSelectionRange) {
inputEl.focus();
inputEl.setSelectionRange(selEnd, selEnd + 1);
// ---- Firefox Workaround ----
// Send a virtual key, which is the character immediately after the
// selected text. It justs rewrites the same character so that no unnecessary changes
// are made to the content.
// When the selection is at the end of the textarea, an extra space is appended
// because the inputEl.value.charCodeAt(selEnd) would otherwise cause an error.
var evt = document.createEvent("KeyboardEvent");
if (inputEl.value.length == selEnd) {
evt.initKeyEvent("keypress", true, true, null, false, false, false, false, 0, 32);
} else {
evt.initKeyEvent("keypress", true, true, null, false, false, false, false, 0, inputEl.value.charCodeAt(selEnd));
}
inputEl.dispatchEvent(evt);
inputEl.setSelectionRange(selStart, selEnd);
}
}
Hope this helps anyone who has been searching for this. I wasted a lot of time trying to figure this out.