簡體   English   中英

在JavaScript中的文本之間插入文本

[英]Insert text between text in Javascript

通過下面的演示 ,我試圖在某些文本之間使用<span>標記突出顯示一些單詞。

這對於某一項正確地起作用,但是,如果我嘗試在段落中添加更多的突出顯示,則要么突出顯示整個內容,要么在添加新的突出顯示之前清除了先前的突出顯示。

如何在一個段落中插入多個突出顯示?

編輯更新了鏈接,以嘗試顯示我如何添加第二個重點...似乎工作方式我的完全不同

在考慮了您想要什么之后,我才能看到它滿足您的要求的唯一方法是使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM