首页 > 网页制作 > HTML/Xhtml教程 > 正文

HTML高亮关键字的完美解决方案_HTML/Xhtml_网页制作

2018-11-10 10:00:31

最近做项目遇到这样的一个功能:在网页中高亮关键字。

本以为一个 innerHTML replace 就能实现的简单操作,却遇到了许多的问题。本文就记录这些问题和最终的完美解决办法, 希望能对有同样遭遇的小伙伴有所帮助。只对结果感兴趣的,忽略过程,直接跳过看结果吧~

常用做法:正则替换

思路:要想高亮元素,那么需要将关键字提取出来用标签包裹,然后对标签进行样式调整。使用 innerHTML,或 outHTML, 而不能使用 innerText,outText。

const regex = new RegExp(keyword,"g")element.innerHTML = element.innerHTML.replace(regex,"<b class="a">"+keyword+"</b>")element.classList.add("highlight")

这样做存在的隐患有如下:

()/div<div id="parent">    <div class="test">test</div>  </div>

关键字父节点 element 通过 class 来进行背景染色处理,对原始DOM有一定程度污染,可能对 element 再次定位造成影响。(作为插件希望尽可能少改变原始DOM)
 

正则优化一:仅处理位于标签内的元素

var formatKeyword = text.replace(/[-////^$*+?.()|[/]{}]/g, '//$&') // 转义处理keyword包含的特殊字符,如 /.var finder = new RegExp(">.*?"++".*?<") // 提取位于标签内的文本,避免误操作 class、id 等element.innerHTML = element.innerHTML.replace(finder,function(matched){        return matched.replace(text,"<br>"+text+</br>)})// 对提取的标签内文本进行关键字替换

以能解决大多数问题,但依旧存在的问题是,只要标签属性存在类似 < 符号,将会打破匹配规则导致正则提取内容错误, HTML5 dataset 可以自定义任意内容,故这些特殊字符是无法避免的。

<div dataset="p>d">替换</div>

正则优化二:清除可能影响的标签

<div id="keyword">keyword</div>  =》将闭合标签用变量替换  [replaced1]keyword[replaced2]//闭合标签内 id="keyword" 不会被处理  =》  [replaced1]<b>keyword</b>[replaced2]  =》将暂存变量 replaced 替换为原先标签  <div id="keyword"><b>keyword</b></div>
  • 这种思路及源码从这里来, 但存在问题是:
  • 如果 [replaced1] 包含 keyword, 那么替换时将发生异常

最重要的,当标签值中包含 <> 符号时,此方法也不能正确的提取标签

总之在经过了N多尝试之后,通过正则都没能有效的处理各种情况。然后换了个思路,不通过字符串的方式,通过节点处理。element.childNodes 可以最有效的清理标签内的干扰信息。

[完美解决方案]通过 DOM 节点处理

<div id="parent">    keyword 1  <span id="child">    keyword 2  </span> </div>

通过 parent.childNodes 得到所有子节点。child 节点可以通过 innerText.replce(keyword,result) 的方式替换得到想要的高亮效果,如下: <span id="child"><b>keyword</b> 2</span> (递归处理:当child节点不含子节点时进行replace操作)。

但是 keyword 1 是属于文本节点,只能修改文本内容,无法增加 HTML,更无法单独控制其样式。而文本节点也不能转换为普通节点,这也是最苦恼的事情。

最后~,本文的重点来了,因为这个功能,让我第一次认真接触到了文本节点这个东西。从这里发现了Text,使用切割文本节点并替换的方式实现高亮。

源码以及还原高亮见源码

const reg = new RegExp(keyword.replace(/[-////^$*+?.()|[/]{}]/g, '//$&'))highlight = function (node,reg){    if (node.nodeType == 3) {  //只处理文本节点        const match = node.data.match(new RegExp(reg));        if (match) {          const highlightEl = document.createElement("b");          highlightEl.dataset.highlight="y"          const wordNode = node.splitText(match.index)          wordNode.splitText(match[0].length); // 切割成前 关键词 后三个Text 节点          const wordNew = document.createTextNode(wordNode.data);          highlightEl.appendChild(wordNew);//highlight 节点构建成功          wordNode.parentNode.replaceChild(highlightEl, wordNode);// 替换该文本节点        }    } else if (node.nodeType == 1 && node.dataset.highlight!="y"    ) {        for (var i = 0; i < node.childNodes.length; i++) {            highlight(node.childNodes[i], reg);            i++        }    }  }

总结

以上所述是小编给大家介绍的HTML高亮关键字的完美解决方案,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

  • 相关标签:HTML/Xhtml教程
  • 本文发布HTML5中文学习网 ,转载请注明出处,感谢您!
  • 相关文章


  • Asp.net Core与类库读取配置文件信息的方法_实用技巧
  • asp.net在Repeater嵌套的Repeater中使用复选框详解_实用技巧
  • 利用IIS调试ASP.NET网站程序的完整步骤_实用技巧
  • Asp.Net Core轻松学习系列之配置文件_实用技巧
  • ASP.NET 页生命周期概述(小结)_实用技巧
  • 详解ASP.NET Core WebApi 返回统一格式参数_实用技巧
  • 2018年网络流行语有哪些?2018年十大网络流行语盘点
  • 华为首席财务官孟晚舟被暂扣 深圳市政府要求加方立即放人!
  • 微信支付勒索病毒制造者被锁定 网友:史上最蠢的黑客!
  • 英国电信宣布从核心设备中删除华为产品 5G不采用
  • 独孤九贱(4)_PHP视频教程

    江湖传言:PHP是世界上最好的编程语言。真的是这样吗?这个梗究竟是从哪来的?学会本课程,你就会明白了。 PHP中文网出品的PHP入门系统教学视频,完全从初学者的角度出发,绝不玩虚的,一切以实用、有用...

    独孤九贱(5)_ThinkPHP5视频教程

    ThinkPHP是国内最流行的中文PHP开发框架,也是您Web项目的最佳选择。《php.cn独孤九贱(5)-ThinkPHP5视频教程》课程以ThinkPHP5最新版本为例,从最基本的框架常识开始,将...

    独孤九贱(1)_HTML5视频教程

    《php.cn原创html5视频教程》课程特色:php中文网原创幽默段子系列课程,以恶搞,段子为主题风格的php视频教程!轻松的教学风格,简短的教学模式,让同学们在不知不觉中,学会了HTML知识。 ...

    ThinkPHP5实战之[教学管理系统]

    本套教程,以一个真实的学校教学管理系统为案例,手把手教会您如何在一张白纸上,从零开始,一步一步的用ThinkPHP5框架快速开发出一个商业项目。

    PHP入门视频教程之一周学会PHP

    所有计算机语言的学习都要从基础开始,《PHP入门视频教程之一周学会PHP》不仅是PHP的基础部分更主要的是PHP语言的核心技术,是学习PHP必须掌握的内容,任何PHP项目的实现都离不开这部分的内容,通...

    作者信息

    kevin

    永远在学习的路上!

    相关教程

  • javascript初级视频教程 javascript初级视频教程
  • jquery 基础视频教程 jquery 基础视频教程
  • javascript三级联动视频教程 javascript三级联动视频教程
  • 独孤九贱(3)_JavaScript视频教程 独孤九贱(3)_JavaScript视频教程
  • 独孤九贱(6)_jQuery视频教程 独孤九贱(6)_jQuery视频教程
  • 热门教程