页内搜索功能实现
来源:互联网 发布:南京政府网络问政 编辑:程序博客网 时间:2024/04/30 19:18
var countText;var currentIndex;var nextIndex;var loopMarket;var arrayIndex = new Array();var currentHasSet;var dataReset;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 highlight(tag,s,isPrevious,searchBoxId){ function replaceText() {if(loopMarket){if(arguments[3] == currentIndex){currentHasSet = false;return "<span class='highlight'>"+decode(s)+"</span>";}if(arguments[3] == nextIndex){if(!dataReset){currentIndex = arguments[3];nextIndex = getNext(currentIndex,isPrevious);dataReset = true;currentHasSet = true;return "<span class='currentlight'>"+decode(s)+"</span>";}}return "<span class='highlight'>"+decode(s)+"</span>";}else{if(!currentIndex){currentIndex = arguments[3];}if(!nextIndex){nextIndex = getNext(currentIndex,isPrevious);}if(currentHasSet){return "<span class='highlight'>"+decode(s)+"</span>";}else{currentHasSet = true;return "<span class='currentlight'>"+decode(s)+"</span>";}} } function countIndex() {arrayIndex.push(arguments[3]);return arguments[0]; } if (s.length==0) {clearAll(document.getElementById(tag)); return false; } if(s!=countText) {countText = s ;currentIndex = null;nextIndex = null;loopMarket =false;arrayIndex = new Array();currentHasSet = false;dataReset = false; } else { loopMarket = true;nextIndex = getNext(currentIndex,isPrevious); } s=encode(s); var obj=document.getElementById(tag); var t=obj.innerHTML.replace(/<span\s+class=.?highlight.?>([^<>]*)<\/span>/gi,"$1"); obj.innerHTML=t; t=obj.innerHTML.replace(/<span\s+class=.?currentlight.?>([^<>]*)<\/span>/gi,"$1"); obj.innerHTML=t; var cnt=loopSearch(s,obj); t=obj.innerHTML var r=/{searchHL}(({(?!\/searchHL})|[^{])*){\/searchHL}/g t=t.replace(r,countIndex); t=t.replace(r,replaceText); obj.innerHTML=t; dataReset = false; document.getElementById(searchBoxId).value=s;}function clearAll(obj){ var t=obj.innerHTML.replace(/<span\s+class=.?highlight.?>([^<>]*)<\/span>/gi,"$1"); obj.innerHTML=t; t=obj.innerHTML.replace(/<span\s+class=.?currentlight.?>([^<>]*)<\/span>/gi,"$1"); obj.innerHTML=t;}function getNext(currentIndex,isPrevious){if(isPrevious){for(var i=0;i<arrayIndex.length;i++){if(arrayIndex[i]==currentIndex){if(-1==(i-1)){return arrayIndex[arrayIndex.length-1];}else{return arrayIndex[i-1];}}}}else{for(var i=0;i<arrayIndex.length;i++){if(arrayIndex[i]==currentIndex){if(arrayIndex.length==(i+1)){return arrayIndex[0];}else{return arrayIndex[i+1];}}}}}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,"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;}