2

我有以下代码可以在 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返回未定义。那么如何获得职位呢?

4

1 回答 1

0

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

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

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

于 2015-08-05T09:27:58.293 回答