在Javascript中的文本之间插入文本

时间:2014-02-05 13:18:53

标签: javascript

使用the following demo,我尝试在某些文字之间使用<span>标记突出显示某些字词。

这适用于一个,但是如果我尝试在段落中添加任何更多的高光,它会突出显示整个内容,或者在添加新内容之前清除上一个突出显示。

我如何能够在一个段落中插入多个精彩集锦?

修改更新了链接以尝试展示我是如何添加第二个高亮显示...它似乎与我的完全相同

1 个答案:

答案 0 :(得分:1)

在考虑了你想要的东西之后,我能看到它符合你要求的唯一方法就是使用Range。最难的是将索引转换为你想要的文本的真实位置,这花了我一段时间,但我相信这将工作

// helper function to walk DOM-tree and find end-points
// basically, converts the index of a character in terms of a HTML element
// into it's offset in a #text Node
function getTextOffset(parent, index) {
    if (parent.nodeType === 3)
        return {'node': parent, 'offset': index};
    var e = parent.childNodes[0], i = index, prev = null;
    while (1) {
        while (e.nodeType !== 3 || e === prev)
            if (e.childNodes && e.childNodes.length)
                e = e.childNodes[0];
            else if (e.nextSibling)
                e = e.nextSibling;
            else {
                while (!e.nextSibling)
                    if (!e.parentNode || e.parentNode === parent)
                        throw RangeError('Index out of range');
                    else
                        e = e.parentNode;
                e = e.nextSibling;
            }
        if (e.data.length < i)
            i -= e.data.length, prev = e;
        else
            return {'node': e, 'offset': i};
    }
}

现在您只需要编写一个函数来创建 Range 并对其进行格式化。

function highlight(node, start, end) {
    var r, o, hi;
    // find text
    r = document.createRange();
    o = getTextOffset(node, start); // find start point
    r.setStart(o.node, o.offset);   // set start in range
    o = getTextOffset(node, end);   // find end point
    r.setEnd(o.node, o.offset);     // set end in range
    // now format
    hi = document.createElement('span');
    hi.style.background = 'yellow';
    hi.appendChild(r.extractContents());
    r.insertNode(hi);
    // cleanup
    r.detach();
}

highlight(containerEl, 3, 5); // invoke

DEMO