页内搜索功能实现

来源:互联网 发布:南京政府网络问政 编辑:程序博客网 时间: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;}


原创粉丝点击