当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《是否有InternetExplorer批准的selectionStart和selectionEnd的替代品?》经验,为你挑选了3个好方法。

找出在真实浏览器中选择的内容非常简单:

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

但IE像往常一样,不明白.什么是最好的跨浏览器方式?



1> Tim Down..:

我会再发布一次这个函数,因为这个问题与另一个问题有关.

以下内容将在所有浏览器中完成,并处理所有新行问题而不会严重影响性能.经过一段时间的努力,我已经到了这里,现在我相信它是最好的这种功能.

UPDATE

此函数确实假设textarea/input具有焦点,因此您可能需要在调用focus()之前调用textarea的方法.

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


我们是否可以根据某些非病毒许可证获得许可,甚至可以为公共领域做出贡献?(这是关心版权的人的声音:-))
@Tomasz:够公平的.我发现自由软件许可的细节令人困惑和沉闷,但我理解一般原则.对于我赠送的东西,我很乐意以最方便用户的方式许可它.

2> bobince..:

IE的Range实现是一个简单的恐怖.它真的希望你使用execrable execCommand接口而不是任何涉及索引到文本中的东西.

我知道有两种获取指数的方法,它们都有问题.第一个使用range.text,如示例代码中所示.不幸的是,range.text习惯于剥离前导和尾随换行符,这意味着如果插入符号/选择位于除第一行之外的行的开头,则之前的长度将取消(换行符数*2)字符和你会得到错误的选定文字.

第二种方法是使用range.moveStart/End(在重复范围内),如此问题的答案中所述:Internet Explorer TextRange中的字符偏移量(但是当您使用已知的textarea父级时,您可以忽略有关的内容节点的发现).这没有相同的问题,但它确实报告所有索引,好像换行是简单的LF字符,即使textarea.value和range.text将它们作为CRLF序列返回!所以你不能直接使用它们来索引textarea,但是你可以用一堆换行计数来修复它们,或者在使用它之前从字符串中替换掉所有的CR.



3> TALlama..:

我目前的解决方案是冗长的,基于这个线程,但我愿意接受更好的解决方案.

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
    }
}

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有