我在另一个问题上发现了这个问题:
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
因为如果文本不包含换行符,则选择正确。
答案 0 :(得分:7)
新行是Opera和IE中textareas中的两个字符(CRLF或\r\n
)和其他浏览器中的一个字符(\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();
}
};