setSelectionRange在浏览器中的表现方式不一样吗?

时间:2012-01-19 15:25:59

标签: javascript jquery html textarea opera

我在另一个问题上发现了这个问题:

 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 个答案:

答案 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();
  }
};