最直接的方法是用 innerHTML + 正则替换实现关键词高亮,需转义关键词特殊字符、使用 RegExp 构造函数动态创建全局忽略大小写的正则,并用 $1 引用匹配内容;不能操作 textContent,须确保只处理文本节点或先净化 HTML 防 XSS。
用
+ 正则替换最直接
浏览器原生不提供“高亮关键词”的 API,得手动把匹配到的文本包上
或带样式的
。核心就是:拿到原始文本 → 用正则找出关键词位置 → 替换为带标签的 HTML 片段。
注意点:
必须用
构造函数(而非字面量),否则无法动态插入变量关键词
要加
标志全局匹配,加
标志忽略大小写(按需)
关键词含正则特殊字符(如
、
、
)必须先转义,否则会报错或误匹配
替换时用
引用匹配内容,避免丢失大小写原始值
示例:
为什么不能直接对
操作
是纯文本,没有 HTML 结构。你往里面塞
标签,它只会当普通字符显示出来,不会渲染成高亮样式。
立即学习
“
前端免费学习笔记(深入)
”;
正确做法是:
操作目标必须是支持 HTML 解析的属性,比如
或
如果原内容来自用户输入或不可信来源,先做 XSS 过滤(比如用
),再高亮,否则
里塞个
就执行了
别在循环里反复赋值
,性能差;优先一次性生成完整 HTML 字符串再写入
标签 vs 自定义
样式
语义正确、开箱即用,但默认样式固定(黄色背景),且部分老浏览器(IE)不支持。
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
更稳妥的做法是用
:
CSS 可完全控制:背景色、字体粗细、圆角、动画等
兼容性好,所有现代浏览器和 IE9+ 都支持
方便用 JS 动态切换高亮状态(比如加
类)
注意加
而非
,避免重复 ID 报错
CSS 示例:
搜索结果中高亮要避开 HTML 标签内容
如果原始文本是 HTML 字符串(比如从接口拿到的富文本摘要),直接正则替换会污染标签结构 —— 比如把
innerHTMLRegExpgi.*($&function highlight(text, keyword) {
if (!keyword.trim()) return text;
const escaped = keyword.replace(/[.*+?^${}()|[]\]/g, '\$&');
const regex = new RegExp(`(${escaped})`, 'gi');
return text.replace(regex, '$1');
}
const html = highlight('JavaScript 是一门语言,javascript 也很流行', 'javascript');
// → '〈mark〉JavaScript〈/mark〉 是一门语言,〈mark〉javascript〈/mark〉 也很流行'
textContenttextContentinnerHTMLinsertAdjacentHTMLDOMPurify.sanitize()keywordinnerHTMLmarkspanhighlight--activeclassid.highlight {
background-color: #ffeb3b;
padding: 0 2px;
border-radius: 3px;
}
里的
js
也高亮,导致标签断裂。
安全做法是只处理文本节点:
用
document.createElement('div').innerHTML = rawHtml
解析成 DOM
遍历所有
Text
节点(
nodeType === 3
),跳过元素节点
对每个文本节点的内容做高亮,再用
replaceChild
替换
最后取
outerHTML
或
innerHTML
输出
简单绕过方案(适用于结构简单、无嵌套标签的摘要):先用正则剔除 HTML 标签再高亮,但会丢失原文本格式,慎用。
实际项目里最容易被忽略的是关键词转义和 HTML 标签干扰这两块,一不留神就出现渲染异常或 XSS 漏洞。
