查看: 12812|回复: 0
打印 上一主题 下一主题

仿google suggest搜索提示php版

[复制链接]
跳转到指定楼层
1#
发表于 2009-4-24 11:26:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
台州网址导航
数据库建表:

CREATE TABLE `xqbar`.`suggest` (  
`id` INT NOT NULL AUTO_INCREMENT ,  
`title` VARCHAR( 100 ) NOT NULL ,  
`hits` INT NOT NULL DEFAULT '0',  
PRIMARY KEY ( `id` )  
) ENGINE = InnoDB
insert into suggest(title,hits)values('xqbar.com',100);  
insert into suggest(title,hits)values('www.xqbar.com',410);
insert into suggest(title,hits)values('http://xqbar.com',700);
insert into suggest(title,hits)values('mail:xqbar.com',200);
insert into suggest(title,hits)values('ftp:xqbar.com',100);
insert into suggest(title,hits)values('http://www.xqbar.com',70);

search.php(返回的字符串需要为 xxx1|xxx2$200|100 格式,并前后对应)

<?php  if($_GET["action"]!=''){  
   #获取用户输入的关键字  
   $keyword=$_GET["keyword"];
    #过滤关键字   
  $keyword=str_replace("[","[[]",$keyword);
    $keyword=str_replace("&","[&]",$keyword);   
  $keyword=str_replace("%","[%]",$keyword);  
   $keyword=str_replace("^","[^]",$keyword);   
#链接数据库   
  $conn=mysql_connect("localhost","xqbar","xqbaradmin");   
  #选择数据库  
   @mysql_select_db("xqbar") or die('sorry');
    mysql_query('set names utf-8');   
#查询语句  
   $sql="select title,hits from suggest where title like '%".$keyword."%' order by hits desc limit 10";  
   $result=mysql_query($sql);  
   #循环得到查询结果,返回字符串     #格式为 结果1|结果2$结果1点击次数|结果2点击次数
    if($result){  
   $i=1;$title='';$hits='';
    while($row=mysql_fetch_array($result,MYSQL_BOTH))  
   {   
    $title=$title.$row['title'];
    $hits=$hits.$row['hits'];   
  if($i<mysql_num_rows($result))   
{   
$title=$title."|";   
  $hits=$hits."|";   
}    $i++;   
   }   
  }     
mysql_close();
}  
?>  

<?php echo $title.'$'.$hits;?> js代码

引入prototye.js有朋友说这个库太大,或者把,不习惯的朋友可以使用jquery.js框架或者直接创建ajax对象,这个我就不想说了,这里直接引用prototye.js框架

<script type="text/javascript" src="prototype.js"></script>

创建层和显示查询结果的js代码



<script type="text/javascript">
//定义变量lastindex 表示为鼠标在查询结果上滑动所在位置,初始为-1  
var lastindex=-1;
//定义变量flag 表示是否根据用户输入的关键字进行ajax查询,flase为允许查询 true为禁止查询
var flag=false;  
//返回的查询结果生成的数组长度  var listlength=0;  
//创建自定字符串,优化效率  function StringBuffer(){this.data=[];}  
//赋值  StringBuffer.prototype.append=function(){this.data.push(arguments[0]);return this;}   
//输出  StringBuffer.prototype.tostring=function(){return this.data.join("");}   //去掉字符串两边空格  String.prototype.Trim = function(){return this.replace(/(^\s*)|(\s*$)/g, "");}  //隐藏函数 主要是隐藏显示的提示下拉层和iframe,关于iframe下面在说其作用  function hiddensearch()  {  $('rlist').style.display="none";  $('rFrame').style.display="none";  }  //显示函数 主要是显示的提示下拉层和iframe 参数num,根据该参数控制要显示提示层和iframe的高度  function showsearch(num)  {    $('rlist').style.display='';    $('rFrame').style.display='';    //这里我定义每个返回查询结果的提示高度为20px,其中提示层总高度又加了num,是因为我在定义样式时使用了padding一个像素    $('rlist').style.height=num*20+num+'px';    //同样定位iframe的高度    $('rFrame').style.height=num*20+num+'px';  }  //返回文本输入框的坐标函数,参数element为要返回的对象,参数offset可选为offsetLeft|offsetTop 分别表示为该对象距离左窗口上角的绝对位置  //www.devdao.com 利用这个函数可以定位我们要显示的提示层位置,使提示层正确的显示在文本输入框下面  function getposition(element,offset)  {      var c=0;      while(element)      {          c+=element[offset];          element=element.offsetParent      }      return c;  }  //创建提示层函数 包括提示层和为了避免在文本输入框下面出现select下拉选框时我们的提示层不能再select之上的iframe  //可以理解为当文本输入框下有select下拉选框时从底向上依次为 select下拉选框-iframe-提示层  function createlist()  {  //创建提示层  var listDiv=document.createElement("div");  //提示层id  listDiv.id="rlist";          listDiv.style.zIndex="2";  listDiv.style.position="absolute";   listDiv.style.border="solid 1px #000000";  listDiv.style.backgroundColor="#FFFFFF";  listDiv.style.display="none";   listDiv.style.width=$('keyword').clientWidth+"px";  listDiv.style.left=getposition($('keyword'),'offsetLeft')+1.5+"px";  listDiv.style.top =(getposition($('keyword'),'offsetTop')+$('keyword').clientHeight +3)+"px";   var listFrame=document.createElement("iframe");  listFrame.id="rFrame";  listFrame.style.zIndex="1";  listFrame.style.position="absolute";  listFrame.style.border="0";  listFrame.style.display="none";   listFrame.style.width=$('keyword').clientWidth+"px";  listFrame.style.left=getposition($('keyword'),'offsetLeft')+1+"px";  listFrame.style.top =(getposition($('keyword'),'offsetTop')+$('keyword').clientHeight +3)+"px";  document.body.appendChild(listDiv);         document.body.appendChild(listFrame);  }  function setstyle(element,classname)  {  switch (classname)      {       case 'm':         element.style.fontSize="12px";      element.style.fontFamily="arial,sans-serif";      element.style.backgroundColor="#3366cc";      element.style.color="black";      element.style.width=$('keyword').clientWidth-2+"px";      element.style.height="20px";            element.style.padding="1px 0px 0px 2px";            if(element.displaySpan)element.displaySpan.style.color="white"     break;       case 'd':         element.style.fontSize="12px";      element.style.fontFamily="arial,sans-serif";      element.style.backgroundColor="white";      element.style.color="black";      element.style.width=$('keyword').clientWidth-2+"px";      element.style.height="20px";            element.style.padding="1px 0px 0px 2px";            if(element.displaySpan)element.displaySpan.style.color="green"     break;    case 't':         element.style.width="80%";      if(window.navigator.userAgent.toLowerCase().indexOf("firefox")!=-1)element.style.cssFloat="left";      else element.style.styleFloat="left";      element.style.whiteSpace="nowrap";      element.style.overflow="hidden";      element.style.textOverflow="ellipsis";      element.style.fontSize="12px";      element.style.textAlign="left";      break;    case 'h':         element.style.width="20%";      if(window.navigator.userAgent.toLowerCase().indexOf("firefox")!=-1)element.style.cssFloat="right";      else element.style.styleFloat="right";      element.style.textAlign="right";      element.style.color="green";      break;      }  }  function focusitem(index)  {    if($('item'+lastindex)!=null)setstyle($('item'+lastindex),'d');    if($('item'+index)!=null)    {     setstyle($('item'+index), 'm');     lastindex=index;    }    else $("keyword").focus();  }  function searchclick(index)  {    $("keyword").value=$('title'+index).innerHTML;    flag=true;  }  function searchkeydown(e)  {  if($('rlist').innerHTML=='')return;    var keycode=(window.navigator.appName=="Microsoft Internet Explorer")?event.keyCode:e.which;    //down    if(keycode==40)    {  if(lastindex==-1||lastindex==listlength-1)  {    focusitem(0);    searchclick(0);  }  else{    focusitem(lastindex+1);    searchclick(lastindex+1);  }    }  if(keycode==38)  {  if(lastindex==-1)  {    focusitem(0);    searchclick(0);  }  else{    focusitem(lastindex-1);    searchclick(lastindex-1);  }  }  if(keycode==13)  {    focusitem(lastindex);    $("keyword").value=$('title'+lastindex).innerText;  }      if(keycode==46||keycode==8){flag=false;ajaxsearch($F('keyword').substring(0,$F('keyword').length-1).Trim());}  }  function showresult(xmlhttp)  {  var result=unescape(xmlhttp.responseText);  if(result!=''){      var resultstring=new StringBuffer();         var title=result.split('$')[0];         var hits=result.split('$')[1];      for(var i=0;i<title.split('|').length;i++)      {      resultstring.append('<div id="item'+i+'" onmousemove="focusitem('+i+')" onmousedown="searchclick('+i+')">');      resultstring.append('<span id=title'+i+'>');      resultstring.append(title.split('|'));      resultstring.append('</span>');      resultstring.append('<span id=hits'+i+'>');      resultstring.append(hits.split('|'));      resultstring.append('</span>');      resultstring.append('</div>');      }      $('rlist').innerHTML=resultstring.tostring();      for(var j=0;j<title.split('|').length;j++)      {       setstyle($('item'+j),'d');    $('item'+j).displaySpan=$('hits'+j);       setstyle($('title'+j),'t');       setstyle($('hits'+j),'h');      }      showsearch(title.split('|').length);      listlength=title.split('|').length;      lastindex=-1;  }  else hiddensearch();  }  function ajaxsearch(value)  {  new Ajax.Request('search.php',{method:"get",parameters:"action=do&keyword="+escape(value),onComplete:showresult});  }  function main()  {  $('keyword').className=$('keyword').className=='inputblue'?'inputfocus':'inputblue';  if($F('keyword').Trim()=='')hiddensearch();  else {        if($F('keyword')!=''&&flag==false)ajaxsearch($F('keyword').Trim());     if(listlength!=0)$('keyword').onkeydown=searchkeydown;     else hiddensearch();  }  }  function oninit()  {  $('keyword').autocomplete="off";  $('keyword').onfocus=main;  $('keyword').onkeyup=main;  $('keyword').onblur=hiddensearch;   createlist();  }  Event.observe(window,'load',oninit);  </script> 搜索框需要设置的代码

<form id="form1" name="form1" method="post" action="">       <b>输入搜索关键字</b>     <input name="keyword" type="text" class="inputblue" id="keyword" maxlength="20" style="width:300px;" />   </form>
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

网站推广
关于我们
  • 台州朗动科技(Tzweb.com)拥有多年开发网站平台系统门户手机客户端等业务的成功经验。主要从事:政企网站,系统平台,微信公众号,各类小程序,手机APP客户端,浙里办微应用,浙政钉微应用、主机域名、虚拟空间、后期维护等服务,满足不同企业公司的需求,是台州地区领先的网络技术服务商!

Hi,扫描关注我

Copyright © 2005-2026 站长论坛 All rights reserved

Powered by 站长论坛 with TZWEB Update Techonolgy Support

快速回复 返回顶部 返回列表