【问题标题】:Text Highlighting using native javascript no jquery使用本机 javascript 没有 jquery 的文本突出显示
【发布时间】:2013-08-19 10:28:06
【问题描述】:

我目前正在使用原生 JS,我正在尝试在 contenteditable div 中构建突出显示文本功能。我已经成功构建了突出显示功能,但是当我想使用单个按钮在突出显示和取消突出显示文本之间切换时遇到了问题。所以我通过

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

我正在使用作为范围对象函数的环绕内容来包装选定的文本。

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。不幸的是,没有办法将文本节点包装为范围变量。

【问题讨论】:

    标签: javascript methods native


    【解决方案1】:

    我在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,'>');
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-22
      • 2013-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 2012-03-28
      相关资源
      最近更新 更多