查询绑定数据岛的表格中的文本并修改显示方式的js代码


Posted in Javascript onDecember 15, 2009
<script language="JavaScript"> 
function findAll(s){ 
if(s.length==0){ 
alert("请输入查询关键字"); 
} s=encode(s); 
var TDs=document.all.DataT1.all.tags("TD"); 
var num=0; 
for(var i=0;i<TDs.length;i++){ 
var tdObj=TDs[i]; 
var obj=tdObj.childNodes[0]; 
if(!obj.className || obj.className!="highlight"){ 
var t=obj.innerHTML.replace(/<span\s+class=.?highlight.?>([^<>]*)<\/span>/gi,"$1"); 
obj.innerHTML=t; 
var cnt=loopSearch(s,obj); 
t=obj.innerHTML; 
var r=/{searchHL}(({(?!\/searchHL})|[^{])*){\/searchHL}/g; 
t=t.replace(r,"<span class='highlight'>$1</span>"); 
obj.innerHTML=t; 
num=num+cnt; 
} 
} 
alert("查找到关键字"+num+"处"); 
} 
function encode(s){ 
return s.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/([\\\.\*\[\]\(\)\$\^])/g,"\\$1"); 
} 
function decode(s){ 
return s.replace(/\\([\\\.\*\[\]\(\)\$\^])/g,"$1").replace(/>/g,">").replace(/</g,"<").replace(/&/g,"&"); 
} 
function loopSearch(s,obj){ 
var cnt=0; 
if(obj.nodeType==3){ 
cnt=replace(s,obj); 
return cnt; 
} 
for(var i=0,c;c=obj.childNodes[i];i++){ 
if(!c.className || c.className!="highlight") 
cnt+=loopSearch(s,c); 
} 
return cnt; 
} 
function replace(s,dest){ 
var r=new RegExp(s,"gi"); 
var tm=null; 
var t=dest.nodeValue; 
var cnt=0; 
var arr=new Array(); 
var a=""; 
var b=""; 
if(tm=t.match(r)){ 
cnt=tm.length; 
a=tm.toString(); 
arr=a.split(","); 
for(var i=0;i<arr.length;i++) 
b="{searchHL}"+arr[i]+"{/searchHL}"; 
t=t.replace(r,b); 
dest.nodeValue=t; 
} 
return cnt; 
} 
</script> 
<style type="text/css"> 
.highlight{background:blue;font-weigh:bold;color:black;} 
</style>

以上方法需要注意的有两点:1,在findAll 中obj取到最小单位,否则的话替换会出乱,我在实践中体会这一点主要是和数据岛绑定有关,一般的文本是不需要这么小心的.2,replace方法将tm拆分成数组,也和表格有关,一般的文本不需要拆分

如果是一般的文本可以如下写

<script language="JavaScript"> 
function findAll(s){ 
if (s.length==0){ 
alert('搜索关键词未填写!'); 
return false; 
} 
s=encode(s); 
var obj=document.getElementsByTagName("body")[0]; 
var t=obj.innerHTML.replace(/<span\s+class=.?highlight.?>([^<>]*)<\/span>/gi,"$1"); 
obj.innerHTML=t; 
var cnt=loopSearch(s,obj); 
t=obj.innerHTML 
var r=/{searchHL}(({(?!\/searchHL})|[^{])*){\/searchHL}/g 
t=t.replace(r,"<span class='highlight'>$1</span>"); 
obj.innerHTML=t; 
alert("搜索到关键词"+cnt+"处") 
} 
function replace(s,dest){ 
var r=new RegExp(s,"g"); 
var tm=null; 
var t=dest.nodeValue; 
var cnt=0; 
if (tm=t.match(r)){ 
cnt=tm.length; 
t=t.replace(r,"{searchHL}"+decode(s)+"{/searchHL}") 
dest.nodeValue=t; 
} 
return cnt; 
} </script>

html部分

<XML ID="DataBinding1" SRC="datasource.xml"></XML> 
<body> 
<input name="s" id="s" title="搜索内容:"/><input type="submit" value="搜索" onClick="findAll(s.value);return false;"/> 
<table width="100%" valign="top" DATASRC="#DataBinding1" id="DataT1" BORDER="1" CELLPADDING="3"> 
<thead> 
<tr> 
<th>ID</th> 
<th>Name</th> 
<th>Desc</th> 
</tr> 
</thead> 
<tbody> 
<tr> 
<td><span name="ID" id="ID" datafld="CODE_ID"> </span></td> 
<td><span name="name" id="name" datafld="CODE_NAME"> </span></td> 
<td><span name="desc" id="desc" datafld="CODE_DESC"> </span></td> 
</tr> 
</tbody> 
</table> 
</body>

<?xml version="1.0" encoding="UTF-8"?> 
<INVENTORY> 
<ROW> 
<CODE_ID>PCOMM11</CODE_ID> 
<CODE_NAME>caracter handle</CODE_NAME> 
<CODE_DESC>hkdlhglfghfkgfk</CODE_DESC> 
</ROW> 
<ROW> 
<CODE_ID>PCOMM12</CODE_ID> 
<CODE_NAME>digital handle</CODE_NAME> 
<CODE_DESC>hkdlhglfghfkgfkgggg</CODE_DESC> 
</ROW> 
</INVENTORY>
Javascript 相关文章推荐
Js+XML 操作
Sep 20 Javascript
两种简单实现菜单高亮显示的JS类代码
Jun 27 Javascript
javascript学习笔记(二) js一些基本概念
Jun 18 Javascript
jQuery-Tools-overlay 使用介绍
Jul 14 Javascript
Node.js中使用计时器定时执行函数详解
Aug 15 Javascript
jQuery对JSON数据进行排序输出的方法
Jun 24 Javascript
RequireJS使用注意细节
May 15 Javascript
javascript的几种写法总结
Sep 30 Javascript
Angular企业级开发——MVC之控制器详解
Feb 20 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
Jan 31 jQuery
Angular设置别名alias的方法
Nov 08 Javascript
微信小程序文字显示换行问题
Jul 28 Javascript
jquery自动完成插件(autocomplete)应用之PHP版
Dec 15 #Javascript
Javascript attachEvent传递参数的办法
Dec 14 #Javascript
firefox下对ajax的onreadystatechange的支持情况分析
Dec 14 #Javascript
javascript document.execCommand() 常用解析
Dec 14 #Javascript
JQuery Tips(3) 关于$()包装集内元素的改变
Dec 14 #Javascript
JQuery Tips(2) 关于$()包装集你不知道的
Dec 14 #Javascript
js 页面传参数时 参数值含特殊字符的问题
Dec 13 #Javascript
You might like
一个简单的自动发送邮件系统(一)
2006/10/09 PHP
BBS(php &amp; mysql)完整版(三)
2006/10/09 PHP
php print EOF实现方法
2009/05/21 PHP
php的4种常见运行方式
2015/03/20 PHP
自定义jQuery选项卡插件实例
2013/03/27 Javascript
js替换字符串的所有示例代码
2013/07/23 Javascript
使用jquery写个更改表格行顺序的小功能
2014/04/29 Javascript
JS 对象属性相关(检查属性、枚举属性等)
2015/04/05 Javascript
JQuery实现样式设置、追加、移除与切换的方法
2015/06/11 Javascript
JavaScript String(字符串)对象的简单实例(推荐)
2016/08/31 Javascript
angular route中使用resolve在uglify压缩后问题解决
2016/09/21 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
详解vue-cli之webpack3构建全面提速优化
2017/12/25 Javascript
基于node下的http小爬虫的示例代码
2018/01/11 Javascript
解决vue打包css文件中背景图片的路径问题
2018/09/03 Javascript
关于vue状态过渡transition不起作用的原因解决
2019/04/09 Javascript
JavaScript实现的滚动公告特效【基于jQuery】
2019/07/10 jQuery
详细分析React 表单与事件
2020/07/08 Javascript
[02:16]2018年度CS GO最具人气选手-完美盛典
2018/12/16 DOTA
回调函数的意义以及python实现实例
2017/06/20 Python
python机器学习理论与实战(六)支持向量机
2018/01/19 Python
Python猴子补丁知识点总结
2020/01/05 Python
Pygame的程序开始示例代码
2020/05/07 Python
css3实现六边形边框的实例代码
2019/05/24 HTML / CSS
什么是Smarty变量操作符?如何使用Smarty变量操作符
2014/07/18 面试题
介绍一下write命令
2014/08/10 面试题
工程造价专业大学生自荐信
2013/10/01 职场文书
水污染治理专业毕业生推荐信
2013/11/14 职场文书
环保建议书作文
2014/03/12 职场文书
2015年创先争优活动总结
2015/03/27 职场文书
2015年园林绿化工作总结
2015/05/23 职场文书
大学生学生会工作总结2015
2015/05/26 职场文书
2015年高中班级工作总结
2015/07/21 职场文书
毕业班工作总结
2015/08/10 职场文书
小学三年级班主任工作经验交流材料
2015/11/02 职场文书
react如何快速设置文件路径别名
2021/04/28 Javascript