简体   繁体   English

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

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

I found this on a different question: 我发现这是一个不同的问题:

 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);

It should select text from a text area between the 8th character and 12th character. 它应该从第8个字符和第12个字符之间的文本区域中选择文本。

It works in Firefox and Chrome, but in Opera I get the wrong selection. 它适用于Firefox和Chrome,但在Opera中我选错了。 Offset moves two characters behind 偏移移动两个字符

What's wrong with it? 它出什么问题了?


It seems it has something to do with new lines: \\n because the selection is correct if the text doesn't contain new line character. 它似乎与新行有关: \\n因为如果文本不包含换行符,则选择正确。

New lines are two characters (CRLF, or \\r\\n ) in textareas in Opera and IE and one character ( \\n ) in other browsers. 新行是Opera和IE中textareas中的两个字符(CRLF或\\r\\n )和其他浏览器中的一个字符( \\n )。 You'll need to adjust for that. 你需要调整它。 Here's a function to do that, treating line breaks as a single character in all browsers. 这是一个执行此操作的功能,将换行符视为所有浏览器中的单个字符。

Live demo: http://jsfiddle.net/DqtVK/1/ 现场演示: http//jsfiddle.net/DqtVK/1/

Code: 码:

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.

相关问题 jQuery更改在浏览器中的行为不一致 - JQuery change behaving inconsistently across browsers Javascript 单元测试中的 setSelectionRange 未按预期运行 - Javascript setSelectionRange in unit tests not behaving as expected 在所有现代浏览器中,javascript正则表达式中的花括号处理是否相同? - Is handling of curly braces in javascript regex is the same across all modern browsers? 通过多个浏览器/ ISP连接识别同一用户 - Identifying the same user across multiple browsers/ISP connections 在各种浏览器中得到广泛支持的最安全的创建原型链的方法是什么? - What is the safest way, broadly supported across browsers, to create prototype chains? 如何在Javascript中的多个浏览器中获得相同的值? - How to get a value to be the same across multiple browsers in Javascript? 所有本地浏览器中的同一匿名Firebase用户 - Same anonymous firebase user across all local browsers 在浏览器之间协调keyCode / charCode的首选方法是什么? - What preferred way to reconcile keyCode/charCode across browsers? 跨浏览器以一致格式获取元素背景色的可靠方法? - Reliable Way to Get Background Color of an Element in a Consistent Format Across Browsers? Textarea在浏览器之间更新的方式不同 - Textarea not updating the same way between browsers
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM