当前位置: 首页 > 知识库问答 >
问题:

使用本机javascript进行文本高亮显示无需jquery

吴康平
2023-03-14

我目前使用的是原生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节点,并再次用文本节点代替它,以使其不突出显示,我需要一些方法用跨度包装文本节点。不幸的是,对于范围变量,没有办法包装文本节点。

共有1个答案

莫誉
2023-03-14

我在这个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,'>');
}
 类似资料:
  • 我想突出显示JavaFX中显示的部分文本。到目前为止,我正在使用对象中的对象。为了突出显示文本中的特定部分,我使用标记将文本切割成部分(objects),以突出显示或不突出显示以下代码。 不幸的是,背景高亮显示不起作用,我有奇怪的换行符,如图所示。文本不包含任何换行符。 (对图片质量表示抱歉,这是一个真实的截图:)) 感谢任何帮助。 解决方案正如@eckig所建议的,在HBox中使用多个标签是一个

  • 我试图在一个tkinter文本小部件中突出显示文本的一部分。如果您知道要突出显示的文本的line.col索引,这很容易做到。但是,我想突出显示的文本部分的索引是典型的字符串索引格式(整数),而不是tkinter要求的line.col索引格式。下面是一些简化的代码,显示了我正在努力实现的目标: 我有三种不同的突出显示文本定义。第一个(highlight_text_index)只使用我要突出显示的文本

  • 在页面上有两个框 这两个框是一个数组的数据类似与 [ 这种格式的我去循环然后画的框 想要实现无论点击这两行哪行 这两行都高亮显示 用过根据id查找页面元素,但id只能返回第一个所以只能第一个高亮

  • 我有一些文本内容显示在UIWebView上,这是普通的html。当前段落以黄色突出显示,用户选择了单词“如果”。(链接到图像:http://i.stack.imgur.com/GKp9h.png) 1)当用户在uiwebiew上选择一些文本时,我如何执行动态高亮?也就是说,当用户选择文本时,选择的文本会以紫色高亮? 例如,我喜欢单词“如果”用紫色突出显示(也许使用window.get选择() ?

  • 我正在使用mouseup事件来触发一个函数,该函数突出显示文本,并用跨度包围突出显示的文本(堆栈溢出函数): 我遇到的主要问题是,只要包含,文本只会在高亮显示尝试中高亮显示约20%(否则高亮显示会立即消失)。我尝试添加一个setTimeout,在1s内不调用surroundContent。我还尝试删除remove()语句,但仍然没有效果。 你知道为什么会这样吗?

  • 我是SWT/JFace技术的新手,我发现了一个让我发疯的问题。在Eclipse RCP应用程序中,我有一个视图,其中放置了一个带有JFace TreeViewer的SWT树,该树通过标签提供程序提供标签和图标。根据客户要求,树的背景颜色为深蓝色,字体颜色为白色。当节点被选中时,这种颜色的组合导致节点文本的可视化效果不佳,文本不适合树区域,我们将鼠标指针放在节点上。不知何故出现了“本地高亮显示”。这