文本突出显示使用本机javascript没有jquery

时间:2013-08-19 10:28:06

标签: javascript methods native

我目前正在使用本机JS,我正在尝试在一个可信的div中构建突出显示文本功能。我已经成功构建了高亮功能,但是当我想使用单个按钮在高亮和非高亮文本之间切换时遇到问题。所以我通过

获取所选文本和所选文本的范围
var selectedText = window.getSelection();
var range = selectedText.getRangeAt(0);

我正在使用环境对象函数surroundContents包装所选文本。

var wrapper = document.createElement("span");
wrapper.setAttribute("class","highlight");

但是现在当我试图取消高亮显示文本的某些部分和纯文本的某些部分时,自然行为应该不会突出显示突出显示的文本并突出显示纯文本。为实现这一目标,我将通过

克隆范围
var clone = range.cloneContents()
var nodeInBetween = clone.childNodes //array of nodes between the start and end nodes.

现在我面临两个问题。首先,我需要删除span.highlight节点并再次用TextNode替换它以使其不亮,我需要一些方法来包装带有span的textnode。不幸的是,没有办法将textnode包装为范围变量。

1 个答案:

答案 0 :(得分:0)

我在this jsFiddle中尝试过(递归)荧光笔方法。它可能对你有用。实际方法:

function highLight(term,root,forElements,styleclass){
    root = root || document.querySelector('body');
    term = term instanceof Array ? term.join('|') : term;

    if (!term) {throw TypeError('Highlighter needs a term to highlight anything');}

    forElements = forElements && forElements instanceof Array 
                    ? forElements.join(',') 
                    : /string/i.test(typeof forElements) ? forElements : '*';
    styleclass = styleclass || 'highlight';

    var allDiv = root.querySelectorAll(forElements),
        re = RegExp(term,'gi'),
        highlighter = function(a){return '<span class="'+styleclass+'">'+a+'</span>'};

    for (var i=0; i<allDiv.length; i+=1){
        // recurse children
        if (allDiv[i].querySelectorAll(forElements).length){
            highLight.call(null,term, allDiv[i],forElements,styleclass);
        }
        // replace term(s) in text nodes
        var node = allDiv[i];
        for (node=node.firstChild; node; node=node.nextSibling) {
            if (node.nodeType===3){
                var re = RegExp(term,'gi');
                node.data = node.data.replace(re,highlighter);
            }
        }

    }
    //finally, replace all text data html encoded brackets
    root.innerHTML = root.innerHTML
                      .replace(/&lt;/gi,'<')
                      .replace(/&gt;/gi,'>');
}