簡體   English   中英

setSelectionRange在瀏覽器中的表現方式不一樣嗎?

[英]setSelectionRange not behaving the same way across browsers?

我發現這是一個不同的問題:

 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因為如果文本不包含換行符,則選擇正確。

新行是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();
  }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM