亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > HTML > 正文

HTML高亮關鍵字的實現代碼

2024-08-26 00:21:06
字體:
來源:轉載
供稿:網友

本以為一個 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")

這樣做存在的隱患有如下:

  • keyword 如果是 ()/ 等正則對象的關鍵字將會構建正則對象失敗。(可以通過轉義解決)
  • keyword 如果是一些 HTML 標簽如 div 將會對 innerHTML 進行錯誤的替換
  • keyword 如果和一些DOM屬性名、值相同,也會導致異常替換。如下當 keyword 為 test 時,會將 class 名也錯誤的替換掉:
<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++        }    }  }

最后,留個彩蛋,以上方法也是存在一個小 bug 的,有興趣可以去發現一下。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到HTML教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品免费看久久久香蕉| 亚洲国产天堂久久国产91| 少妇久久久久久| 奇米一区二区三区四区久久| 久久国产精品电影| 亚洲高清免费观看高清完整版| 亚洲欧美日韩国产精品| 久久久久久尹人网香蕉| 亚洲风情亚aⅴ在线发布| 久久精品视频亚洲| 性欧美xxxx| 久久久久久久国产精品视频| 欧美视频在线观看 亚洲欧| 久久99久久亚洲国产| 欧美夫妻性生活视频| 日本免费一区二区三区视频观看| 91精品国产网站| 日韩在线播放av| 国产精品高潮呻吟久久av黑人| 亚洲福利视频久久| 日韩免费在线观看视频| 91伊人影院在线播放| 日韩免费av在线| 欧美精品激情blacked18| 欧美一级电影免费在线观看| 在线成人免费网站| 欧美日韩aaaa| 亚洲最新视频在线| 亚洲午夜av久久乱码| 欧美日韩国产一区中文午夜| 欧美日产国产成人免费图片| 国产一区二区三区在线视频| 久久久国产精品免费| 孩xxxx性bbbb欧美| 亚洲天堂av网| 国产精品小说在线| 亚洲欧美制服丝袜| 欧美成人午夜免费视在线看片| 亚洲国产欧美在线成人app| 欧美一级大胆视频| 久久精品99久久香蕉国产色戒| 欧美在线一区二区三区四| 欧美亚洲在线观看| 91免费电影网站| 亚洲人成在线观看网站高清| 亚洲电影在线观看| 亚洲自拍偷拍在线| 夜夜嗨av色综合久久久综合网| 欧美性极品xxxx做受| 日韩av色在线| 精品国产电影一区| 97视频在线免费观看| 亚洲精品久久久久久久久久久久| 国产精品美女www爽爽爽视频| 欧美黑人狂野猛交老妇| 国产精品日韩久久久久| 97成人超碰免| 欧美性猛交xxx| 美日韩精品免费视频| 92看片淫黄大片欧美看国产片| 久久这里有精品视频| 久久久久久久激情视频| 国产婷婷97碰碰久久人人蜜臀| 91av在线免费观看视频| 欧美成人激情视频免费观看| 5252色成人免费视频| 狠狠躁夜夜躁久久躁别揉| 久久综合久久88| 大荫蒂欧美视频另类xxxx| 亚洲欧洲在线观看| 亚洲女人初尝黑人巨大| 国产一区二区三区在线播放免费观看| 亚洲人成电影网站| 欧美一区二区色| 成人观看高清在线观看免费| 欧美精品电影免费在线观看| 成人国产精品久久久| 久久影院免费观看| 亚洲free嫩bbb| 精品久久久久久亚洲精品| 亚洲人成免费电影| 日韩久久免费视频| 日韩免费观看网站| 国产成人啪精品视频免费网| 久久久久久久电影一区| 亚洲毛茸茸少妇高潮呻吟| 欧美怡红院视频一区二区三区| 欧美高清videos高潮hd| 亚洲男人天堂网| 国产精品美乳在线观看| 久久男人资源视频| www高清在线视频日韩欧美| 精品香蕉一区二区三区| 久久久成人精品| 欧美高清视频在线播放| 91精品国产91久久久久久吃药| 国产精品一区二区三区成人| 中文字幕九色91在线| 97香蕉超级碰碰久久免费的优势| 日韩欧美国产免费播放| 91热精品视频| 91成人在线观看国产| 欧美精品性视频| 亚洲精品一区久久久久久| 国产91热爆ts人妖在线| 亲爱的老师9免费观看全集电视剧| 热久久免费国产视频| 日韩在线播放av| 亚洲精选在线观看| 视频在线一区二区| 亚洲精品理论电影| 最近2019中文字幕一页二页| 97**国产露脸精品国产| 91精品久久久久久久久不口人| 97视频在线观看成人| 一区二区三区国产在线观看| 亚洲精品永久免费精品| 亚洲香蕉成人av网站在线观看| www亚洲精品| 另类专区欧美制服同性| 久久手机免费视频| 日韩av色综合| 久久精品国产一区二区电影| 欧美日韩国产一区在线| 国产日韩欧美在线播放| 97人人模人人爽人人喊中文字| 亚洲免费精彩视频| 97精品在线观看| 亚洲视频国产视频| 国产精品极品美女在线观看免费| 青青草一区二区| 97热精品视频官网| 蜜臀久久99精品久久久无需会员| 2019日本中文字幕| 欧美成人性生活| 亚洲精品久久久久中文字幕欢迎你| 中文字幕综合一区| 国产日韩欧美91| 国产狼人综合免费视频| 亚洲国产中文字幕在线观看| 亚洲欧美日韩在线一区| 国产精品夜色7777狼人| 欧美成年人视频网站欧美| 久久影视免费观看| 伊人伊成久久人综合网小说| 欧美日韩免费观看中文| 91精品久久久久久综合乱菊| 美女国内精品自产拍在线播放| 欧美精品videos性欧美| 亚洲石原莉奈一区二区在线观看| 亚洲伊人成综合成人网| 国产精品永久免费观看| 91极品女神在线| 亚洲娇小xxxx欧美娇小| 成人午夜在线视频一区| 成人黄色片网站| 欧美激情xxxxx| 日韩欧美中文字幕在线观看| 亚洲一区www| 久久久久久久91| 亚洲激情视频在线播放| 日韩免费av片在线观看| 日韩一区二区欧美| 欧美日韩在线另类|