是否有Internet Explorer批准的替代品selectionStart和selectionEnd?

在真实浏览器中查找所选内容简单如下:

var range = { start: textbox.selectionStart, end: textbox.selectionEnd } 

但IE浏览器像往常一样,不明白。 什么是最好的跨浏览器的方式来做到这一点?

我会再次发布这个函数,看看这个问题是从另一个链接。

以下将在所有浏览器中完成工作,处理所有新的线路问题,而不会严重影响性能。 我经历了一段时间之后就已经到了这里,现在我相当确信这是最好的function。

UPDATE

这个函数假定textarea / input有焦点,所以你可能需要在调用textarea的focus()方法之前调用它。

 function getInputSelection(el) { var start = 0, end = 0, normalizedValue, range, textInputRange, len, endRange; if (typeof el.selectionStart == "number" && typeof el.selectionEnd == "number") { start = el.selectionStart; end = el.selectionEnd; } else { range = document.selection.createRange(); if (range && range.parentElement() == el) { len = el.value.length; normalizedValue = el.value.replace(/\r\n/g, "\n"); // Create a working TextRange that lives only in the input textInputRange = el.createTextRange(); textInputRange.moveToBookmark(range.getBookmark()); // Check if the start and end of the selection are at the very end // of the input, since moveStart/moveEnd doesn't return what we want // in those cases endRange = el.createTextRange(); endRange.collapse(false); if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) { start = end = len; } else { start = -textInputRange.moveStart("character", -len); start += normalizedValue.slice(0, start).split("\n").length - 1; if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) { end = len; } else { end = -textInputRange.moveEnd("character", -len); end += normalizedValue.slice(0, end).split("\n").length - 1; } } } } return { start: start, end: end }; } var el = document.getElementById("your_input"); el.focus(); var sel = getInputSelection(el); alert(sel.start + ", " + sel.end); 

IE的范围实施是一个slithy恐怖。 它确实希望你使用可执行的execCommand接口,而不是涉及索引到文本的任何东西。

我知道有两种获取指数的方法,它们都有问题。 第一个使用range.text作为你的示例代码。 不幸的是,range.text有一个习惯,就是去掉前面和后面的换行符,这意味着,如果脱字符/select是在第一行以外的行的开头,那么beforeLength将会被(换行符数* 2)个字符和你会得到错误的选定的文本。

第二种方法是使用range.moveStart / End(在一个重复的范围内),如这个问题的答案中所概述的那样: 在Internet Explorer TextRange中的字符偏移量 (但是,因为您正在使用已知的textarea父项,您可以忽略有关节点的发现)。 这没有同样的问题,但它报告所有的索引,就好像换行符是简单的LF字符,即使textarea.value和range.text将它们作为CRLF序列返回! 所以你不能直接使用它们来索引textarea,但是你可以用一堆换行符来修复它们,或者直接用stringreplace掉所有的值,然后再使用它。

我目前的解决scheme是冗长的,基于这个线程 ,但我打开更好的解决scheme。

 function getSelection(inputBox) { if ("selectionStart" in inputBox) { return { start: inputBox.selectionStart, end: inputBox.selectionEnd } } //and now, the blinkered IE way var bookmark = document.selection.createRange().getBookmark() var selection = inputBox.createTextRange() selection.moveToBookmark(bookmark) var before = inputBox.createTextRange() before.collapse(true) before.setEndPoint("EndToStart", selection) var beforeLength = before.text.length var selLength = selection.text.length return { start: beforeLength, end: beforeLength + selLength } } 

从BootstrapFormHelpers

  function getCursorPosition($element) { var position = 0, selection; if (document.selection) { // IE Support $element.focus(); selection = document.selection.createRange(); selection.moveStart ('character', -$element.value.length); position = selection.text.length; } else if ($element.selectionStart || $element.selectionStart === 0) { position = $element.selectionStart; } return position; } function setCursorPosition($element, position) { var selection; if (document.selection) { // IE Support $element.focus (); selection = document.selection.createRange(); selection.moveStart ('character', -$element.value.length); selection.moveStart ('character', position); selection.moveEnd ('character', 0); selection.select (); } else if ($element.selectionStart || $element.selectionStart === 0) { $element.selectionStart = position; $element.selectionEnd = position; $element.focus (); } }