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 相关文章推荐
prototype 1.5相关知识及他人笔记
Dec 16 Javascript
jQuery 类twitter的文本字数限制带提示效果插件
Apr 16 Javascript
前端开发必须知道的JS之原型和继承
Jul 06 Javascript
jQuery中nextAll()方法用法实例
Jan 07 Javascript
详解基于Bootstrap扁平化的后台框架Ace
Nov 27 Javascript
javascript性能优化之事件委托实例详解
Dec 12 Javascript
js判断当前页面在移动设备还是在PC端中打开
Jan 06 Javascript
自定义require函数让浏览器按需加载Js文件
Nov 24 Javascript
原生JS实现左右箭头选择日期实例代码
Mar 14 Javascript
Vue列表渲染的示例代码
Nov 01 Javascript
Vue 自定义指令实现一键 Copy功能
Sep 16 Javascript
layui 中select下拉change事件失效的解决方法
Sep 20 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中的gzcompress、gzdeflate、gzencode函数详解
2014/07/29 PHP
zend框架实现支持sql server的操作方法
2016/12/08 PHP
php命名空间设计思想、用法与缺点分析
2019/07/17 PHP
js的alert样式如何更改如背景颜色
2014/01/22 Javascript
JavaScript中的闭包(Closure)详细介绍
2014/12/30 Javascript
详细分析Javascript中创建对象的四种方式
2016/08/17 Javascript
Vue表单实例代码
2016/09/05 Javascript
AngularJS 应用身份认证的技巧总结
2016/11/07 Javascript
微信小程序 中wx.chooseAddress(OBJECT)实例详解
2017/03/31 Javascript
微信小程序实现顶部选项卡(swiper)
2020/06/19 Javascript
JQuery 选择器、DOM节点操作练习实例
2017/09/28 jQuery
微信小程序使用modal组件弹出对话框功能示例
2017/11/29 Javascript
写给小白看的JavaScript异步
2017/11/29 Javascript
redux-saga 初识和使用
2018/03/10 Javascript
详解使用create-react-app添加css modules、sasss和antd
2018/07/31 Javascript
node.js处理前端提交的GET请求
2019/08/30 Javascript
vue 的 solt 子组件过滤过程解析
2019/09/07 Javascript
微信小程序 点击切换样式scroll-view实现代码实例
2019/10/11 Javascript
vue使用video插件vue-video-player的示例
2020/10/03 Javascript
[37:35]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第二局
2016/02/25 DOTA
Python实现简单的文本相似度分析操作详解
2018/06/16 Python
Pyqt QImage 与 np array 转换方法
2019/06/27 Python
使用Python实现正态分布、正态分布采样
2019/11/20 Python
关于初始种子自动选取的区域生长实例(python+opencv)
2020/01/16 Python
Python3自动生成MySQL数据字典的markdown文本的实现
2020/05/07 Python
小狗电器官方商城:中国高端吸尘器品牌
2017/03/29 全球购物
以实惠的价格提供高品质的时尚:Newchic
2018/01/18 全球购物
NBA欧洲商店(西班牙):NBA Europe Store ES
2019/04/16 全球购物
类、抽象类、接口的差异
2016/06/13 面试题
初级软件工程师面试题 Junior Software Engineer Interview
2015/02/15 面试题
先进个人获奖感言
2014/01/24 职场文书
竞选部门副经理的自荐书范文
2014/02/11 职场文书
辞职信怎么写?
2019/05/21 职场文书
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python
拒绝盗图!教你怎么用python给图片加水印
2021/06/04 Python
vue css 相对路径导入问题级踩坑记录
2022/06/05 Vue.js