查询绑定数据岛的表格中的文本并修改显示方式的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鼠标悬停特效具体方法
Jun 17 Javascript
JavaScript实现找出数组中最长的连续数字序列
Sep 03 Javascript
node.js中的fs.link方法使用说明
Dec 15 Javascript
如何编写高质量JS代码
Dec 28 Javascript
vue.js绑定class和style样式(6)
Dec 09 Javascript
微信小程序页面传值实例分析
Apr 19 Javascript
JS实现将链接生成二维码并转为图片的方法
Mar 17 Javascript
ng-events类似ionic中Events的angular全局事件
Sep 05 Javascript
如何通过setTimeout理解JS运行机制详解
Mar 23 Javascript
JS学习笔记之贪吃蛇小游戏demo实例详解
May 29 Javascript
react实现antd线上主题动态切换功能
Aug 12 Javascript
解决echarts数据二次渲染不成功的问题
Jul 20 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
PHP计算2点经纬度之间的距离代码
2013/08/12 PHP
简单谈谈PHP中的Reload操作
2016/12/12 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
jquery的ajax异步请求接收返回json数据实例
2014/06/16 Javascript
JQuery遍历json数组的3种方法
2014/11/08 Javascript
jquery checkbox 勾选的bug问题解决方案与分析
2014/11/13 Javascript
通过隐藏iframe实现无刷新上传文件操作
2016/03/16 Javascript
jquery制做精致的倒计时特效
2016/06/13 Javascript
JS实现探测网站链接的方法【测试可用】
2016/11/08 Javascript
AngularJS ionic手势事件的使用总结
2017/08/09 Javascript
Vue.js框架路由使用方法实例详解
2017/08/25 Javascript
自定义PC微信扫码登录样式写法
2017/12/12 Javascript
用Node提供静态文件服务的方法
2018/07/06 Javascript
详解Nodejs get获取远程服务器接口数据
2019/03/26 NodeJs
详解一个基于套接字实现长连接的express
2019/03/28 Javascript
vue组件三大核心概念图文详解
2019/05/30 Javascript
javascript实现打砖块小游戏(附完整源码)
2020/09/18 Javascript
Python使用gensim计算文档相似性
2016/04/10 Python
TensorFlow实现Batch Normalization
2018/03/08 Python
Python爬虫常用小技巧之设置代理IP
2018/09/13 Python
pycharm重置设置,恢复默认设置的方法
2018/10/22 Python
python实现名片管理系统项目
2019/04/26 Python
python 表格打印代码实例解析
2019/10/12 Python
jupyternotebook 撤销删除的操作方式
2020/04/17 Python
详解Canvas事件绑定
2018/06/27 HTML / CSS
html5 application cache遇到的严重问题
2012/12/26 HTML / CSS
html5生成柱状图(条形图)效果的实例代码
2016/03/25 HTML / CSS
马来西亚网上花店:FlowerAdvisor马来西亚
2020/01/03 全球购物
Solaris操作系统的线程机制
2012/12/23 面试题
优秀交警事迹材料
2014/01/26 职场文书
中西医专业毕业生职业规划书
2014/02/24 职场文书
大型主题婚礼活动策划方案
2014/09/15 职场文书
2014年便民服务中心工作总结
2014/12/20 职场文书
农村环境卫生倡议书
2015/04/29 职场文书
2016年中秋节寄语大全
2015/12/07 职场文书
javascript的var与let,const之间的区别详解
2022/02/18 Javascript