【问题标题】:setSelectionRange not behaving the same way across browsers?setSelectionRange 在浏览器中的行为方式不同?
【发布时间】:2012-02-14 06:22:54
【问题描述】:

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

 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 因为如果文本不包含换行符,则选择是正确的。

【问题讨论】:

  • 我看到的方式是您缺少函数的输入参数。它在参数列表中,但您没有将其传递给您的函数。检查一下:jsfiddle.net/7Tsx6 并尝试删除 document.getElementById 部分并尝试两种情况。
  • 不,这只是我的问题中的一个错误,忘记添加输入参数。当文本区域有新行时出现问题
  • 根据上面的评论,你传递的是 jQuery 对象还是实际元素?

标签: javascript jquery html textarea opera


【解决方案1】:

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

【讨论】:

  • 出于某种原因,我不得不将 newOffset += 更改为 newOffset -=
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 2023-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多