在IE11中查找文本范围的起始位置

时间:2015-04-23 19:12:43

标签: javascript html internet-explorer textrange

我已经获得以下代码来查找IE11中的一段文字

var search_position = 0;
function findMyText(find)
{       
    // create range (selects all text)
    var range = document.body.createTextRange();
    range.moveToElementText(document.getElementById("editor"));

    if(search_position == 0)
    {
        range.moveStart("word", 0);                     
        range.findText(find);
    }

    // find the nth word that matches, where n is search_position
    for (var i = 0; i < search_position; i++)
    {
        range.moveStart("word", 1);                     
        range.findText(find);
    }

    search_position++;

    range.select();

    var l = range.text.length
    if(l < find.length)
    {
        search_position = 0;
    }
}

这会找到find的每个连续实例并选择它。它的工作原理是找到一段文本的第一个实例,标记搜索索引,然后移动到下一个单词。

我真正想做的是从某个光标位置开始而不循环遍历所有文本。如同,如果用户将光标放在文本的中间,我想从那一点开始搜索。我还想添加一个替换功能。我可以移动到像这样的特定角色位置

range.moveStart("character", x);

其中x是字符位置。我可以使用以下代码从光标位置获取此字符位置。

function getCaretPosition() {
    var ie = (typeof document.selection != "undefined" && document.selection.type != "Control") && true;
    var w3 = (typeof window.getSelection != "undefined") && true;
    var caretOffset = 0;
    if (w3) {
        var range = window.getSelection().getRangeAt(0);
        var preCaretRange = range.cloneRange();
        preCaretRange.selectNodeContents(editor);
        preCaretRange.setEnd(range.endContainer, range.endOffset);
        caretOffset = preCaretRange.toString().length;
    }
    else if (ie) {
        var textRange = document.selection.createRange();
        var preCaretTextRange = document.body.createTextRange();
        preCaretTextRange.expand(editor);
        preCaretTextRange.setEndPoint("EndToEnd", textRange);
        caretOffset = preCaretTextRange.text.length;
    }
    return caretOffset;
}

所做的,并且需要的是找到我的范围的当前开始位置。我需要知道这一点,我的替换方法才能正常工作。当我替换一个单词时,我需要知道我在文档中的位置。

range.startOffset返回undefined。那么我该如何获得这个职位呢?

1 个答案:

答案 0 :(得分:0)

我通过使用Tim Down的优秀Rangy库找到了解决方法。以下代码

var range = rangy.createRange();
range.setStart(document.getElementById("editor"), 0);

我的find函数最终放弃了这种方法,但这是如何使用Rangy解决原始问题