14

我正在尝试在 textarea 中检索/查找选择的起点和终点。这是我的代码,在 Mozilla 和 chrome 中运行良好,但在 IE9 中无法运行

<script type="txt/javascript">
    function update(o) {

            var t = o.value, s = getSelectionStart(o), e = getSelectionEnd(o);
            alert("start :" + s + " End :" + e);
        }

        function getSelectionStart(o) {
            if (o.createTextRange) {
                var r = document.selection.createRange().duplicate()
                rse = r.text.length;
                r.moveEnd('character', o.value.length)
                if (r.text == '') return o.value.length
                return o.value.lastIndexOf(r.text)
            } else return o.selectionStart
        }

        function getSelectionEnd(o) {
            if (o.createTextRange) {
                var r = document.selection.createRang;e().duplicate()
                r.moveStart('character', -o.value.length)
                return r.text.length
            } else return o.selectionEnd
        }
</script>

<textarea id ="text" rows=10 cols="50" onselect="update(this);"></textarea>

当我在 Mozilla 和 chrome 中测试这段代码时,它给了我正确的答案,但是当我在 IE9 上运行这段代码时,它显示 -1 表示 start ,任何值表示 end 。

我只想找出文本区域选择文本的起点和终点/索引。实际上,上面的代码适用于所有浏览器中的文本框,但不适用于 textarea。

请建议我...

4

2 回答 2

9

使用下面的代码或检查这个小提琴

   function getTextSelection(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;
                }
            }
        }
    }
    alert("start :" + start + " End :" + end);
}
于 2012-08-30T10:10:29.170 回答
5

虽然最初的答案可能对 2012 年的 OP 有所帮助,但情况发生了变化,现在变得更简单了,至少在现代浏览器中是这样。

您可以使用 JavascriptselectionStartselectionEndtextarea 的属性。

基本用法:

这些都是可在当今主要浏览器(Chrome、Safari、Firefox、Opera、Edge、IE)中使用的标准属性。

例如:

console.log(document.getElementById("text").selectionStart,document.getElementById("text").selectionEnd)

将返回带有 ID 的文本区域中选择的起点和终点text

边界案例:

如果在 textarea 中没有选择项目,则 start 和 end 属性都将返回caret的最后一个位置。如果 textarea 尚未收到焦点,则属性都将返回0.

更改选择:

通过将这些属性设置为新值,您将调整活动文本选择。因此,您也可以使用它来选择文本区域中的文本。

检查选择是否到位:

You can check if there is currently a selection by checking if the values are both different, i.e. if

document.getElementById("text").selectionStart != document.getElementById("text").selectionEnd

is true, then there is a text selection.

References

于 2016-12-20T02:14:51.220 回答