• 仿百度的搜索下拉提示


           ajax的应用在当今web项目上,到处都是最常见也用的最多的地方就应该是登录、表单和搜索提示了。今天分享下自己用到的搜索下拉提示。

           第一步,是前台展示的时候:

    //输入框
    <input type="text" id="textword" onkeyup="showtip(event,this);" onkeydown="regword(this);" onclick="showtip(event,this);event.cancelBubble = true;event.returnValue = false;" />
    <input type="button" id="btnsearch" />
    //提示列表容器
    <ul id="sosotip" onclick="hiddtip()"></ul>
     
        第二步,是后台发回的数据格式:
    <li id="litooltip1" onmouseover="mousestyle(this,1)" onclick="redirect(‘提示词1’)"><label>提示词1</label><span>共被搜索10次</span></li>
    <li id="litooltip2" onmouseover="mousestyle(this,2)" onclick="redirect(‘提示词2’)"><label>提示词2</label><span>共被搜索6次</span></li>
    <li id="litooltip3" onmouseover="mousestyle(this,3)" onclick="redirect(‘提示词3’)"><label>提示词3</label><span>共被搜索2次</span></li>
    

          服务器端直接传回的是组织好的html代码,这样的话,会使传输时数据膨胀,但这样的话,把比较的复杂的处理都放到的服务器一端,实现起来更方便和简单。另外,至于样式的定位和显示,这里就不贴出来了,全凭自己兴趣,想怎么显示自己看着办。

          下面,就是重点,js代码了:

    //   隐藏提示框
    function hiddtip(){var tipul = document.getElementById("sosotip");tipul.style.display="none";}
    //   键盘上下操作自动改变输入框的值
    function autotext(strtext){document.getElementById("textword").value=strtext;}
    //   点击页面其它部分时隐藏提示框
    document.body.onclick=function(){hiddtip();};
    
    
    var preword="";    //   记录键盘操作按下时的文本框值
    var current=0;     //   现在选择的提示列表的第几项
    var staticword="";  //  记录键盘操作按下时的文本框值,忽略上下键的操作
    
    //   onkeydown触发时,记录此时记录文本框的值(以便onkeyup时文本框的值比较决定是否请求服务器)
    function regword(target)   
    {
       var tempword = target.value.replace(/\s/g,"");
       if(tempword != "")
       {
          preword=tempword;
       } 
    }
    
    //  显示提示列表,文本框onkeyup和onclick时触发
    function showtip(oEvent,target)
    {
      var sword = target.value.replace(/\s/g,"");    // 此时文本框的值
      var ulcontainer = document.getElementById("sosotip"); //提示列表容器 
      if(sword == "")
      {
          ulcontainer.style.display="none";   //  文本框值为空时,隐藏提示
      }  
      else if(sword.length <20)
      {
         if(sword != preword)               // 操作后,文本框值改变
         {  
            current=0;
            preword = sword;
            if(oEvent.keyCode!="38" || oEvent.keyCode!="40")
            {
              staticword= preword;
            }
            ulcontainer.style.display="none";  
            ulcontainer.innerHTML ="";
                 $.ajax({                               //  请求
                     type:"GET",
                     url:"Ashx/searchtip.ashx",
                     data:{word:sword },
                     success:function(result)
                     {
                         if(result != "0")
                         {
                            ulcontainer.innerHTML = result;
                            ulcontainer.style.display="block"; 
                         }
                     }
                 });
           }
           else if(ulcontainer.innerHTML != "")//操作后文本框词未变
           {
               ulcontainer.style.display="block"; 
               clearallstyle();     //   清除提示列表上的所有样式
               if(oEvent.keyCode=="38")    //   是键盘上的向上操作时
               {
                   current--;
                   if(current == -1)   //达到列表最上方时选中最后一个
                   {
                      var uls = document.getElementById("sosotip");
                      var ochilds = uls.childNodes;
                      current = ochilds.length;
                      addlistyle(oEvent,ochilds[current-1]); //选中最后一个
                    }
                    else
                    {
               var fotar = document.getElementById("litooltip"+current);
                        if(fotar != null)
                        {
                           addlistyle(oEvent,fotar);
                        } 
                        else      //   选中为第一个时再向上回到文本框
                        { 
                          current=0;
                          autotext(staticword);    
                        }
                     } 
                }
                else if(oEvent.keyCode=="40")   //   是键盘上的向下操作时
                {
                   current++;
              var fotar = document.getElementById("litooltip"+current);
                   if(fotar != null)
                   {
                      addlistyle(oEvent,fotar);
                   } 
                   else       //到第一个时回到文本框
                   {
                           current=0;autotext(staticword);
                   }
                }
                else if(oEvent.keyCode=="13")   //  Enter键时,触发按钮
                {
                   document.getElementById("btnsearch ").click();
                }
            }
        }
    }
    //   键盘上下时为选中的项加选中样式
    function addlistyle(oEvent,target)
    {
       target.style.cssText="background-color:#36C;color:#fff;";
       autotext(target.childNodes[0].innerHTML);
       oEvent.cancelBubble = true;oEvent.returnValue = false; 
    }
    
    //   鼠标与键盘的交互,鼠标选中时按上下键可以按鼠标选中的当前上下
    function mousestyle(target,currflag)
    {
       clearallstyle();
       target.style.cssText="background-color:#36C;cursor:pointer;color:#fff;"; 
       current = currflag;
    }
    // 清除提示的选中样式
    function clearallstyle()
    {
         var uls = document.getElementById("sosotip");
         var ochilds = uls.childNodes;
         for(var i=0;i<ochilds.length;i++)
         {
             ochilds[i].style.cssText="";
         }
    }
    //  鼠标点击某一项时触发
    function redirect(word)
    { 
      location.href="search.aspx?w="+encodeURI(word);
    }
    

         其中ajax的请求用的是jquery。

  • 相关阅读:
    也谈一下关于兔子的问题
    关于sql函数返回表
    关于1000瓶水的问题
    WWF的疑问
    天干和地支
    在若干个整数中找到相加之和为某个整数的所有组合的算法
    输出一个数组的全排列
    新的博客, 新的里程
    学习搜索引擎心得(10.2511.25)
    下一个阶段(用C++重写Lucene的计划)
  • 原文地址:https://www.cnblogs.com/forcertain/p/1946041.html
Copyright © 2020-2023  润新知