setSelectionRange не ведет себя одинаково во всех браузерах?
Я нашел это по другому вопросу:
setCaretToPos = function(input, selectionStart, selectionEnd){
if(input.setSelectionRange){
input.focus();
input.setSelectionRange(selectionStart, selectionEnd);
}else if(input.createTextRange){
var range = input.createTextRange();
range.collapse(true);
range.moveEnd('character', selectionEnd);
range.moveStart('character', selectionStart);
range.select();
}
};
setCaretToPos(8, 12);
Следует выбрать текст в текстовой области между 8-м и 12-м символами.
Это работает в Firefox и Chrome, но в Opera я получаю неправильный выбор. Смещение сдвигает два символа позади
Что с этим не так?
Кажется, это как-то связано с новыми строками:
\n
потому что выбор правильный, если текст не содержит символа новой строки.
1 ответ
Решение
Новые строки состоят из двух символов (CRLF или \r\n
) в текстовых областях в Opera и IE и один символ (\n
) в других браузерах. Вы должны будете приспособиться к этому. Вот функция, которая делает это, обрабатывая разрывы строк как один символ во всех браузерах.
Демонстрация в реальном времени: http://jsfiddle.net/DqtVK/1/
Код:
function adjustOffset(el, offset) {
var val = el.value, newOffset = offset;
if (val.indexOf("\r\n") > -1) {
var matches = val.replace(/\r\n/g, "\n").slice(0, offset).match(/\n/g);
newOffset += matches ? matches.length : 0;
}
return newOffset;
}
var setCaretToPos = function(input, selectionStart, selectionEnd){
input.focus();
if(input.setSelectionRange){
selectionStart = adjustOffset(input, selectionStart);
selectionEnd = adjustOffset(input, selectionEnd);
input.setSelectionRange(selectionStart, selectionEnd);
}else if(input.createTextRange){
var range = input.createTextRange();
range.collapse(true);
range.moveEnd('character', selectionEnd);
range.moveStart('character', selectionStart);
range.select();
}
};