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 相关文章推荐
在chrome浏览器中,防止input[text]和textarea在聚焦时出现黄色边框的解决方法
May 24 Javascript
Android中资源文件(非代码部分)的使用概览
Dec 18 Javascript
Extjs Label的 fieldLabel和html属性值对齐的方法
Jun 15 Javascript
js中将String转换为number以便比较
Jul 08 Javascript
javascript中的正则表达式使用详解
Aug 30 Javascript
让DIV的滚动条自动滚动到最底部的3种方法(推荐)
Sep 24 Javascript
轻松理解JavaScript之AJAX
Mar 15 Javascript
JavaScript设计模式之策略模式详解
Jun 09 Javascript
基于Vue的移动端图片裁剪组件功能
Nov 28 Javascript
Vue+jquery实现表格指定列的文字收缩的示例代码
Jan 09 jQuery
JavaScript函数apply()和call()用法与异同分析
Aug 10 Javascript
使用layui日期控件laydate对开始和结束时间进行联动控制的方法
Sep 06 Javascript
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加密扩展库Mcrypt安装和实例
2013/11/10 PHP
对PHP新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
php+redis在实际项目中HTTP 500: Internal Server Error故障排除
2017/02/05 PHP
基于PHP的加载类操作以及其他两种魔术方法的应用实例
2017/08/28 PHP
PHP实现的mongoDB数据库操作类完整实例
2018/04/10 PHP
ext监听事件方法[初级篇]
2008/04/27 Javascript
Jquery AJAX 用于计算点击率(统计)
2010/06/30 Javascript
js中关于new Object时传参的一些细节分析
2011/03/13 Javascript
jQuery EasyUI API 中文文档 搜索框
2011/09/29 Javascript
常用js字符串判断方法整理
2013/10/18 Javascript
JS实现可关闭的对联广告效果代码
2015/09/14 Javascript
使用postMesssage()实现iframe跨域页面间的信息传递
2016/03/29 Javascript
基于JavaScript实现 网页切出 网站title变化代码
2016/04/03 Javascript
全面了解构造函数继承关键apply call
2016/07/26 Javascript
jQuery表单对象属性过滤选择器实例详解
2016/09/13 Javascript
Angular下H5上传图片的方法(可多张上传)
2017/01/09 Javascript
JavaScript用200行代码制作打飞机小游戏实例
2017/06/21 Javascript
View.post() 不靠谱的地方你知道多少
2017/08/29 Javascript
使用Vue开发动态刷新Echarts组件的教程详解
2018/03/22 Javascript
axios异步提交表单数据的几种方法
2019/08/11 Javascript
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
python使用smtplib模块通过gmail实现邮件发送的方法
2015/05/08 Python
使用pyecharts在jupyter notebook上绘图
2020/04/23 Python
利用python修改json文件的value方法
2018/12/31 Python
Python3+Appium安装使用教程
2019/07/05 Python
手机端用rem+scss做适配的详解
2017/11/15 HTML / CSS
瑞典首都斯德哥尔摩的多元奢侈时尚品牌:Acne Studios
2017/07/09 全球购物
艺术家策划的室内设计:Curious Egg
2019/03/06 全球购物
如何从一个文件档案的尾端新增记录
2016/12/02 面试题
项目合作协议书范本
2014/04/16 职场文书
给市场的环保建议书
2014/05/14 职场文书
给校长的一封检讨书
2014/09/20 职场文书
2014村书记党建工作汇报材料
2014/11/02 职场文书
考研英语辞职信
2015/05/13 职场文书
2015年教师节主持词
2015/07/03 职场文书
利用Selenium添加cookie实现自动登录的示例代码(fofa)
2021/05/08 Python