js 关键词高亮(根据ID/tag高亮关键字)案例介绍


Posted in Javascript onJanuary 21, 2013
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<title>JS 关键词高亮</title> 
<script type="text/javascript"> 
/* 
* 参数说明: 
* obj: 对象, 要进行高亮显示的html标签节点. 
* hlWords: 字符串, 要进行高亮的关键词词, 使用 竖杠(|)或空格分隔多个词 . 
* bgColor: 背景颜色,默认为红色. 
*/ 
function MarkHighLight(obj, hlWords, bgColor) { 
hlWords = AnalyzeHighLightWords(hlWords); 
if (obj == null || hlWords.length == 0) 
return; 
if (bgColor == null || bgColor == "") { 
bgColor = "red"; 
} 
MarkHighLightCore(obj, hlWords); 
//执行高亮标记的核心方法 
function MarkHighLightCore(obj, keyWords) { 
var re = new RegExp(keyWords, "i"); 
var style = ' style="background-color:' + bgColor + ';" ' 
for (var i = 0; i < obj.childNodes.length; i++) { 
var childObj = obj.childNodes[i]; 
if (childObj.nodeType == 3) { 
if (childObj.data.search(re) == -1) continue; 
var reResult = new RegExp("(" + keyWords + ")", "gi"); 
var objResult = document.createElement("span"); 
objResult.innerHTML = childObj.data.replace(reResult, "<span" + style + ">$1</span>"); 
if (childObj.data == objResult.childNodes[0].innerHTML) continue; 
obj.replaceChild(objResult, childObj); 
} else if (childObj.nodeType == 1) { 
MarkHighLightCore(childObj, keyWords); 
} 
} 
} 
//分析关键词 
function AnalyzeHighLightWords(hlWords) { 
if (hlWords == null) return ""; 
hlWords = hlWords.replace(/\s+/g, "|").replace(/\|+/g, "|"); 
hlWords = hlWords.replace(/(^\|*)|(\|*$)/g, ""); 
if (hlWords.length == 0) return ""; 
var wordsArr = hlWords.split("|"); 
if (wordsArr.length > 1) { 
var resultArr = BubbleSort(wordsArr); 
var result = ""; 
for (var i = 0; i < resultArr.length; i++) { 
result = result + "|" + resultArr[i]; 
} 
return result.replace(/(^\|*)|(\|*$)/g, ""); 
} else { 
return hlWords; 
} 
} 
//利用冒泡排序法把长的关键词放前面 
function BubbleSort(arr) { 
var temp, exchange; 
for (var i = 0; i < arr.length; i++) { 
exchange = false; 
for (var j = arr.length - 2; j >= i; j--) { 
if ((arr[j + 1].length) > (arr[j]).length) { 
temp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = temp; 
exchange = true; 
} 
} 
if (!exchange) break; 
} 
return arr; 
} 
} 
//end 
function search() { 
var obj = document.getElementById("waiDiv"); 
var keyWord = document.getElementById("keyWord"); 
MarkHighLight(obj, keyWord.value, "Orange"); 
} 
</script> 
</head> 
<body> 
<div id="waiDiv"> 
<input type="text" id="keyWord" /> 
<input type="button" value="搜索" onclick="search()" /><br /> 
<br /> 
<div id="contentDiv"> 
二货朋友玩游戏被骗1200块,报警后被告知不够2000没办法立案。强大的二货又往那个账号寄了800块。你说那骗子是开心呢?还是开心极了呢。 
</div> 
</div> 
</body> 
</html>

改进版
function highlightWord(node, word) { 
// Iterate into this nodes childNodes 
if (node.hasChildNodes) { 
var hi_cn; 
for (hi_cn = 0; hi_cn < node.childNodes.length; hi_cn++) { 
highlightWord(node.childNodes[hi_cn], word); 
} 
} 
// And do this node itself 
if (node.nodeType == 3) { // text node 
tempNodeVal = node.nodeValue.toLowerCase(); 
tempWordVal = word.toLowerCase(); 
if (tempNodeVal.indexOf(tempWordVal) != -1) { 
pn = node.parentNode; 
if (pn.className != "highlight") { 
// word has not already been highlighted! 
nv = node.nodeValue; 
ni = tempNodeVal.indexOf(tempWordVal); 
// Create a load of replacement nodes 
before = document.createTextNode(nv.substr(0, ni)); 
docWordVal = nv.substr(ni, word.length); 
after = document.createTextNode(nv.substr(ni + word.length)); 
hiwordtext = document.createTextNode(docWordVal); 
hiword = document.createElement("span"); 
hiword.className = "highlight"; 
hiword.appendChild(hiwordtext); 
pn.insertBefore(before, node); 
pn.insertBefore(hiword, node); 
pn.insertBefore(after, node); 
pn.removeChild(node); 
} 
} 
} 
} 
//根据Tag名高亮关键字 
function SearchHighlightTag(node, key) { 
if (!document.createElement) return; 
if (key.length === 0) return false; 
var array = new Array(); 
array = key.split(" "); 
var element = document.getElementsByTagName(node); 
for (var i = 0; i < array.length; i++) { 
for (var j = 0; j < element.length; j++) { 
highlightWord(element[j], array[i]); 
} 
} 
} 
//根据ID高亮关键字 
function SearchHighlightID(node, key) { 
if (!document.createElement) return; 
if (key.length === 0) return false; 
var array = new Array(); 
array = key.split(" "); 
var element = document.getElementById(node); 
for (var i = 0; i < array.length; i++) { 
for (var j = 0; j < element.length; j++) { 
highlightWord(element, array[i]); 
} 
} 
}
Javascript 相关文章推荐
JavaScript 基础问答三
Dec 03 Javascript
16个最流行的JavaScript框架[推荐]
May 29 Javascript
javascript中关于break,continue的特殊用法与介绍
May 24 Javascript
返回顶部按钮响应滚动且动态显示与隐藏
Oct 14 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记6)
Dec 20 Javascript
JS正则表达式判断有效数实例代码
Mar 13 Javascript
使用Dropzone.js上传的示例代码
Oct 10 Javascript
vue-cli 自定义指令directive 添加验证滑块示例
Oct 19 Javascript
Vue插件打包与发布的方法示例
Aug 20 Javascript
vuex直接赋值的三种方法总结
Sep 16 Javascript
vue-cli3+ts+webpack实现多入口多出口功能
May 30 Javascript
vue打开新窗口并实现传参的图文实例
Mar 04 Vue.js
ExtJS中文乱码之GBK格式编码解决方案及代码
Jan 20 #Javascript
使用jquery实现图文切换效果另加特效
Jan 20 #Javascript
分享一个我自己写的ToolTip提示插件(附源码)
Jan 20 #Javascript
使用jQuery.fn自定义jQuery翻页插件
Jan 20 #Javascript
javascript改变position值实现菜单滚动至顶部后固定
Jan 18 #Javascript
js+数组实现网页上显示时间/星期几的实用方法
Jan 18 #Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
Jan 18 #Javascript
You might like
php中的curl_multi系列函数使用例子
2014/07/29 PHP
PHP中iconv函数转码时截断字符问题的解决方法
2015/01/21 PHP
提高Laravel应用性能方法详解
2019/06/24 PHP
php实现QQ小程序发送模板消息功能
2019/09/18 PHP
javascript encodeURI和encodeURIComponent的比较
2010/04/03 Javascript
jQuery实现的Div窗口震动特效
2014/06/09 Javascript
常用的Javascript数据验证插件
2015/08/04 Javascript
Angular中的$watch、$watchGroup、$watchCollection
2017/06/25 Javascript
Angularjs的键盘事件的绑定
2017/07/27 Javascript
jQuery的ztree仿windows文件新建和拖拽功能的实现代码
2018/12/05 jQuery
layui 弹出删除确认界面的实例
2019/09/06 Javascript
使用flow来规范javascript的变量类型
2019/09/12 Javascript
浅谈vue.watch的触发条件是什么
2020/11/07 Javascript
五句话帮你轻松搞定js原型链
2020/12/09 Javascript
[26:24]完美副总裁、DOTA2负责人蔡玮专访:电竞如人生
2014/09/11 DOTA
Python实现合并同一个文件夹下所有txt文件的方法示例
2018/04/26 Python
python3 求约数的实例
2019/12/05 Python
Python统计学一数据的概括性度量详解
2020/03/03 Python
python实现手势识别的示例(入门)
2020/04/15 Python
python 使用多线程创建一个Buffer缓存器的实现思路
2020/07/02 Python
python属于哪种语言
2020/08/16 Python
python/golang实现循环链表的示例代码
2020/09/14 Python
Pycharm常用快捷键总结及配置方法
2020/11/14 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
2021/01/08 Python
python3定位并识别图片验证码实现自动登录功能
2021/01/29 Python
Champion澳大利亚官网:美国冠军运动服装
2018/05/07 全球购物
建筑施工员岗位职责
2013/11/26 职场文书
求职信的最佳写作思路
2014/02/01 职场文书
五年级科学教学反思
2014/02/05 职场文书
《在大海中永生》教学反思
2014/02/24 职场文书
周年庆典主持词
2014/04/02 职场文书
会计试用期自我评价怎么写
2014/09/18 职场文书
乡镇党员干部群众路线对照检查材料思想汇报
2014/09/28 职场文书
因公司原因离职的辞职信范文
2015/05/12 职场文书
导游词之清晏园
2019/11/22 职场文书
导游词之南昌滕王阁
2019/11/29 职场文书