如果你调用函数
突出显示(员工);
这就是ECMAScript 2018+中该函数的样子:
功能突出显示(员工){Array.from(document.querySelectorAll(“body,body*:not(script):not(style):no(noscript)”).flatMap(({childNodes})=>[…childNodes]).filter(({nodeType,textContent})=>nodeType===文档。TEXT_NODE&&textContent.includes(员工)).forEach((textNode)=>textNode.replaceWith(…textNode.textContent.split(employee).flatMap((part)=>[document.createTextNode(部件),Object.assign(document.createElement(“标记”){text内容:员工})]).切片(0,-1));//上面的flatMap创建了一个[text,employeeName,text,Employee Name,text,embloyeeName]-模式。我们需要删除最后一个多余的employeeName。}
这是ECMAScript 5.1版本:
功能突出显示(员工){Array.prototype.slice.call(document.querySelectorAll(“body,body*:not(script):not.map(函数(元素){return Array.prototype.slice.call(elem.childNodes);//然后提取它们的子节点并将其转换为数组。}).reduce(函数(节点A、节点B){return nodesA.concat(nodesB);//将每个阵列展平为单个阵列}).filter(函数(节点){return node.nodeType===文档。TEXT_NODE&&NODE.textContent.indexOf(员工)>-1;//仅筛选包含员工姓名的文本节点。}).forEach(函数(节点){var nextNode=node.nextSibling,//记住下一个节点(如果存在)parent=node.parentNode,//记住父节点content=node.textContent,//记住内容新节点=[];//为新突出显示的内容创建空数组node.pparentNode.removeChild(节点);//暂时将其移除。content.split(employee).forEach(function(part,i,arr){//查找员工姓名的每次出现newNodes.push(document.createTextNode(part));//为周围的所有内容创建文本节点如果(i<arr.长度-1){newNodes.push(document.createElement(“mark”));//为每次出现的员工姓名创建标记元素节点newNodes[newNodes.length-1].innerHTML=员工;//newNodes[newNodes.length-1].setAttribute(“类”,“突出显示”);}});newNodes.forEach(函数(n){//将所有内容追加或插入到位if(nextNode){parent.insertBefore(n,nextNode);}其他{parent.appendChild(n);}});});}
替换单个文本节点的主要好处是不会丢失事件侦听器。现场保持完整,只有文本变化。
而不是作记号
元素,您还可以使用跨度
并用班
属性并在CSS中指定。
这是一个例子,我使用了这个函数和随后的突出显示(“文本”);
上的MDN页文本
节点:
(未突出显示的一个事件是SVG节点<iframe>
).