查询绑定数据岛的表格中的文本并修改显示方式的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小玩意 几个属性相加不能超过一个特定值.
Sep 29 Javascript
jquery ajax 如何向jsp提交表单数据
Aug 23 Javascript
jQuery解析Json实例详解
Nov 24 Javascript
微信小程序开发一键登录 获取session_key和openid实例
Nov 23 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
Jan 09 Javascript
Angular2学习教程之ng中变更检测问题详解
May 28 Javascript
JavaScript之iterable_动力节点Java学院整理
Jun 29 Javascript
JS实现简单的选择题测评系统代码思路详解(demo)
Sep 03 Javascript
基于Node.js实现压缩和解压缩的方法
Feb 13 Javascript
vue-lazyload使用总结(推荐)
Nov 01 Javascript
JS面向对象编程——ES6 中class的继承用法详解
Mar 03 Javascript
JavaScript的一些小技巧分享
Jan 06 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
example1.php
2006/10/09 PHP
简单的php新闻发布系统教程
2014/05/09 PHP
教你如何用php实现LOL数据远程获取
2014/06/10 PHP
Yii配置文件用法详解
2014/12/04 PHP
写js时遇到的一些小问题
2010/12/06 Javascript
js中的scroll和offset 使用比较的实例与分析
2013/09/29 Javascript
js利用数组length属性清空和截短数组的小例子
2014/01/15 Javascript
使用JavaScript链式编程实现模拟Jquery函数
2014/12/21 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
JavaScript实现图片自动加载的瀑布流效果
2016/04/11 Javascript
jQuery Mobile操作HTML5的常用函数总结
2016/05/17 Javascript
基于JS实现textarea中获取动态剩余字数的方法
2016/05/25 Javascript
js验证真实姓名与身份证号,手机号的简单实例
2016/07/18 Javascript
Javascript基于jQuery UI实现选中区域拖拽效果
2016/11/25 Javascript
浅谈DOM的操作以及性能优化问题-重绘重排
2017/01/08 Javascript
深入理解Javascript箭头函数中的this
2017/02/13 Javascript
详解刷新页面vuex数据不消失和不跳转页面的解决
2018/01/30 Javascript
详解VueJS应用中管理用户权限
2018/02/02 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
2018/09/27 Javascript
Nodejs技巧之Exceljs表格操作用法示例
2019/11/06 NodeJs
js实现课堂随机点名系统
2019/11/21 Javascript
Windows下用py2exe将Python程序打包成exe程序的教程
2015/04/08 Python
Python的ORM框架中SQLAlchemy库的查询操作的教程
2015/04/25 Python
python3大文件解压和基本操作
2017/12/15 Python
Python使用一行代码获取上个月是几月
2018/08/30 Python
超级实用的8个Python列表技巧
2020/08/24 Python
pyx文件 生成pyd 文件用于 cython调用的实现
2021/03/04 Python
详解如何解决H5开发使用wx.hideMenuItems无效果不生效
2021/01/20 HTML / CSS
全球最大的户外用品零售商之一:The House
2018/06/12 全球购物
外贸业务员求职信范文
2013/12/12 职场文书
求职信范文英文版
2014/01/05 职场文书
集团薪酬管理制度
2014/01/13 职场文书
新手上路标语
2014/06/20 职场文书
幼儿园六一主持词
2015/06/30 职场文书
期中考试后的感想
2015/08/07 职场文书
python可视化大屏库big_screen示例详解
2021/11/23 Python