当前位置: 首页 > 面试题库 >

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

田鹤轩
2023-03-14
问题内容

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

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

但是IE和往常一样不懂。跨浏览器的最佳方法是什么?


问题答案:

我将再次发布此函数,以查看该问题是否与另一个问题相关联。

以下将在所有浏览器中完成工作,并处理所有新行问题,而不会严重影响性能。我经过一番折腾之后才来到这里,现在我很确信这是最好的功能。

更新

此函数确实假定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);


 类似资料:
  • 问题内容: py2exe是否有替代品? 问题答案: cx_Freeze是跨平台的,并且具有相同的功能,或者您可以使用py2app,它仅在Mac上有效。

  • 我如何能够检查root是否真的被授予? 另请注意,如何使用命令存储命令的输出?

  • 问题内容: 我试图通过FOP渲染大约100,000-80列记录,并且每次都几乎耗尽(OutOfMemoryException)。我知道iText可以处理这种负载,但是由于LGPL许可证,我无法使用它。iText是否有其他Java库可以处理将大量数据呈现为PDF的问题? 问题答案: 有商业PDF生成库,例如BFO和ElegantJ。如果您需要开源,则有PDFBox,但我不知道它是否已准备好投入生产。

  • 问题内容: 如果我使用Oracle,则有一个可用于创建层次查询的关键字。当前,我在一个项目上使用MySQL,我想知道MySQL中是否有替代方法? 我尝试谷歌,但无济于事。我想要实现的是通过一个查询从数据库中获取一棵树。涉及两个表: 和。后者包含两个ID,一个是,另一个是。因此,它基本上是一个自联接,我可以使用该模型创建图。实际上,它目前仅用于创建树,但是将来可能会改变。但无论哪种情况,我都想拥有的

  • 根据文件中的说明: setState()不会立即改变this.state,但会创建挂起的状态转换。调用此方法后访问this.state可能会返回现有值。 对setState的调用不能保证同步操作,可能会为了提高性能而对调用进行批处理。 因此,由于是异步的,因此无法保证其同步性能。是否有同步的替代方法。 例如 因为值是以前的值,所以什么是替代方案,将给予使用。 Stackoverflow上有几个问题

  • 问题内容: .NET世界是否有Maven替代品或端口? 我很乐意使用Java世界拥有的良好的依赖管理系统,但是我发现没有什么可与.NET项目相提并论的。 问题答案: NMaven是为.NET 提供Apache Maven 的第一个/官方的工作。该项目未能消除对Apache正式项目的高要求,并于2008年11月从Apache孵化器中退出。曾有过多次努力使该项目分叉并幸存,但只有其中的一个(NPand