亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

基于jquery實現智能提示控件intellSeach.js

2019-11-20 10:22:44
字體:
來源:轉載
供稿:網友

一、需求

  我們經常會遇到【站內搜索】的需求,為了提高用戶體驗,我們希望能做到像百度那樣的即時智能提示。例如:某公司人事管理系統,想搜索李XX,只要輸入“李”,系統自然會提示一些姓李的員工,這樣方便用戶使用。說白了,就是用戶邊輸入,系統會提示相關的結果;或者,當用戶點擊搜索框時,就推薦一些內容,如360、百度都會提示今天的主要新聞或搜索量大的內容。

  jquery 已經有一個這樣的插件了,叫 autocomplete, 但我覺得不好用。關于autocomplete的介紹也很多,有興趣的朋友可以去試試。

  看標題就知道,這里只是分享一個插件,不會討論后臺搜索的相關算法和過程,也就是說,后臺返回特定格式的數據,控件負責渲染結果呈現。ok,先看一下效果圖:

  

樣式與控件無關,只需要一個 input text 就可以了。

二、參數說明

  控件以json格式作為傳輸格式。參數比較多,大部分都有默認值(具體看源碼),有些可能不常用,保持默認即可。如下:

  url: 請求地址。如:Handler.ashx, 后臺獲取數據的地址

      property: 要顯示的json對象的屬性。如果我們直接返回["tom","tom cat","tom2"] 這樣的形式,那么該屬性可以不用設置;但有時候我們會返回[{"Name":"tom","ID":"001"},{"Name":"tom cat","ID":"002"},{"Name":"tom2","ID":"003"}] 這樣的形式,顯示的是Name,那么設置該屬性為"Name"即可。至于我們想在點擊的時候獲得點擊的項的ID,通過點擊事件即可。

      itemNumber: 顯示的項數目。

      isEmptyRequest: focus時,空白是否發起請求。就像前面說的,如果點擊搜索框時(此時沒有內容),想要推薦一些內容,設置該屬性為true,即會發起請求。

      defaultValue: 默認值。通常會是:“請輸入關鍵詞...” 這類的提示。

      width: 下拉列表寬度。

   aligner: 要對齊的元素。

      maxHeight: 最大高度。如果設置該高度,超過時就會出現滾動條。                    

      ajax:{
        timeout: 超時時間
            cache: 是否緩存
      },      

  event:{          
           setData: 發送請求前觸發。用于設置參數
           itemClick: 點擊項觸發
           enterKeydown: 按下enter鍵觸發
           beforeRender: 所有項呈現前觸發
           endRender: 所有項呈現后觸發
           itemBeforeRender: 項呈現前觸發
           itemAfterRender: 項呈現后觸發           
           beforeSend: 發送請求前觸發。用戶設置請求頭部參數等,相當于jquery ajax 的 beforeSend。
     }

   event 里的方法都會在適當的時候觸發,需要注意的是,所有方法都接收一個參數,該參數是一個對象,有4個屬性,某些情況如果沒有該屬性的,則為空。包括如下屬性:

   jthis: input 的 jQuery 對象。

   jItem: 項的 jQuery 對象。

     data: 返回的 json 字符串。如果在前臺需要對返回 json 再進行處理,那么可以通過 data 屬性獲得,處理完成后,需要將 json 字符串 return。

   event: 事件對象,如按下 enter 時的事件對象。

三、例子

  使用例子:

$("#search").intellSearch({  url:"Handler.ashx",  property:"Name",  itemNumber:5,  isEmptyRequest:false,  defaultValue:"請輸入關鍵字...",      width:$("#search").width() + 2,  maxHeight:-1,  event:{    itemClick:function(obj){      alert(obj.item.ID);    },    enterKeydown:function(obj){      if(obj.item){        alert("有當前項");      }else{        alert("沒有當前項");      }    }  }  });

四、總結  

  如果你還有自己的邏輯需要處理,也支持鏈式調用,大可以這樣寫 $("#search").intellSearch({參數...}).focus(function(){你的處理...});

  分享該插件希望能幫助到有需要的朋友,主要用于學習。由于是v1.0,可能還有一些bug,有發現的朋友也可以告訴我,我會及時修正。  

附源代碼

js代碼

/*搜索智能提示 v1.0 date:2015.09.08 */;(function(w,$){  $.fn.intellSearch = function(options){    var jthis = this;    var _dftOpts = {      url:"",//請求地址或數組                property:"",//要顯示的json對象的屬性      itemNumber:5,//顯示的條數      isEmptyRequest:false,//focus空白是否發起請求      defaultValue:"",//默認值      width:0,//列表寬度      aligner:jthis,//要對齊的元素      maxHeight:-1,//最大高度                ajax:{        timeout:3000,//超時時間        cache:true//是否緩存      },      event:{        /*參數說明:parameter:{jthis:"jq input",jItem:"jq item",data:"json result",event:"event"}*/        setData:null,//設置參數        itemClick:null,//點擊項觸發        enterKeydown:null,//按下enter鍵觸發        beforeRender:null,//所有項呈現前觸發        endRender:null,//所有項呈現后觸發        itemBeforeRender:null,//項呈現前觸發        itemAfterRender:null,//項呈現后觸發        beforeSend:null//發送請求前觸發      }    };    $.extend(_dftOpts,options);    if(!_dftOpts.url){      throw Error("url不能為空!");    }    var jResult;            var _value = "";        var _ajax = _dftOpts.ajax;    var _event = _dftOpts.event;    var _cache = [];    var _focusCount = 0;//防止focus觸發多次(sogou)         /*on window*/    window.intellObj = window.intellObj || {}; /*for global event*/    window.intellDocumentClick = window.intellDocumentClick || function(e){      if(!window.intellObj.jthis){        return;      }      if(e.target !== window.intellObj.jthis[0]){        setIntellObj(null);      }    }    window.intellDocumentKeydown = window.intellDocumentKeydown || function(e){      var jthis = window.intellObj.jthis;      if(!jthis){        return;      }      var code = e.keyCode;      var value = window.intellObj.value;            var jResult,jCurItem,keyword;      if(code === 13 || code === 38 || code === 40){        jResult = window.intellObj.jResult;        jItems = jResult.find("li");        jCurItem = jResult.find("li.cur");        if(code === 13){          if(jCurItem.length > 0){            jCurItem.click();          }else{            setIntellObj(null);                       if(_event.enterKeydown){              _event.enterKeydown({"jthis":jthis,"event":e});            }          }          jthis.blur();        }else if(jItems.length > 0){          if(code === 38){            if(jCurItem.length <= 0){              jCurItem = jItems.last();              jCurItem.addClass("cur");              keyword = jCurItem.text();            }else{              var index = jCurItem.index();              jCurItem.removeClass("cur");              if(index <= 0){                keyword = value;                            }else{                jCurItem = jItems.eq(index-1);                jCurItem.addClass("cur");                keyword = jCurItem.text();              }            }            jthis.val(keyword);          }else{            if(jCurItem.length <= 0){              jCurItem = jItems.first();              jCurItem.addClass("cur");              keyword = jCurItem.text();            }else{              var index = jCurItem.index();              jCurItem.removeClass("cur");              if(index + 1 >= jItems.length){                keyword = value;              }else{                jCurItem = jItems.eq(index+1);                jCurItem.addClass("cur");                keyword = jCurItem.text();              }            }            jthis.val(keyword);          }        }      }    }    /*event handler*/    $.fn.unintell = function(){      remove();    }    $(document).unbind({click:window.intellDocumentClick,keydown:window.intellDocumentKeydown})          .bind({click:window.intellDocumentClick,keydown:window.intellDocumentKeydown});    jthis.focus(function(){      _focusCount++;      if(_focusCount > 1){        return;      }      if(window.intellObj.jthis && jthis !== window.intellObj.jthis){        setIntellObj(null);      }      var keyword = attrValue();      if(keyword === _dftOpts.defaultValue){        keyword = "";        attrValue(keyword);      }      if(keyword || _dftOpts.isEmptyRequest){        sendRequest();      }    })    jthis.blur(function(){            _focusCount = 0;      if(!attrValue()){        attrValue(_dftOpts.defaultValue);      }          })    jthis.keyup(function(e){      if(e.keyCode === 38 || e.keyCode === 40){        return;      }      var keyword = attrValue();      if(!keyword){        remove();        window.intellObj.value = _value = "";        return;      }      if(keyword !== _value){        window.intellObj.value = _value = keyword;        sendRequest();      }    });         return initBox();         /*function*/    function initBox(){      attrValue(_dftOpts.defaultValue);      return jthis;    }        function initIntell(){            generate();      register();      setIntellObj({jthis:jthis,jResult:jResult});    }    function generate(){      var offset = _dftOpts.aligner.offset();      var width = _dftOpts.width ? _dftOpts.width : _dftOpts.aligner.width();      jResult = $("<ul>",{"class":"intellResult"});      jResult.width(width).css({"position":"absolute","left":offset.left,"top":offset.top + jthis.outerHeight()});      $("body").append(jResult);      if(_dftOpts.maxHeight > 0){        jResult.height(_dftOpts.maxHeight).css("overflowY","scroll");      }    }    function remove(){      if(jResult){        jResult.remove();        jResult = null;      }    }    function register(){      jResult.on("click","li",function(){        var jItem = $(this);        var index = jItem.index();        var keyword = jItem.text();        attrValue(keyword);                _value = keyword;                if(_event.itemClick){          _event.itemClick({"jthis":jthis,"jItem":jItem,"item":_cache[index]});        }      }).on("mouseenter","li",function(){        $(this).siblings("li").removeClass("cur").end().addClass("cur");      }).on("mouseleave","li",function(){        $(this).removeClass("cur");      });    }    function setIntellObj(obj){      if(!obj){        if(window.intellObj.jResult){          window.intellObj.jResult.remove();        }        window.intellObj.jthis = null;        window.intellObj.jResult = null;      }else{        window.intellObj.jthis = obj.jthis;        window.intellObj.jResult = obj.jResult;      }    }    function sendRequest(){      var data;      if(_event.setData){                data = _event.setData({"jthis":jthis});      }      $.ajax({        url:_dftOpts.url,        data:data,        cache:_ajax.cache,        timeout:_ajax.timeout,        beforeSend:function(xhr){          if(_event.beforeSend){            _event.beforeSend(xhr);          }        },        success:function(data){          remove();          showData(data);        },        error:null      });    }    function showData(data){      data = $.trim(data) ? $.parseJSON(data) : data;      if(_event.beforeRender){        var rs = _event.beforeRender({"jthis":jthis,"data":data});        if(rs === false){          return;        }        if(rs !== undefined){          data = rs;        }      }      if(!data){        return;      }      var jItem,jA,jSpan,hasProp,item,text,otherTexts,isRender,index;      var list = $.isArray(data) ? data : [data];      var length = list.length;      length = length > _dftOpts.itemNumber ? _dftOpts.itemNumber : list.length;      if(length <= 0){        return;      }      initIntell();      _cache.length = 0;      hasProp = list[0][_dftOpts.property];      for(var i=0;i<length;i++){        item = list[i];        if(item === null || item === undefined){          continue;        }        text = hasProp ? item[_dftOpts.property] : item;        text = $.trim(text.toString());        if(text === ""){          continue;        }        jItem = $("<li>",{"class":"intellResult_item"});        jA = $("<a>",{"title":text}).appendTo(jItem);        jSpan = $("<span>").appendTo(jA);        index = text.toLowerCase().indexOf(_value.toLowerCase());        otherTexts = splitText(text,_value,index);        if(otherTexts){          jSpan.text(text.substr(index,_value.length));          if(otherTexts.length > 1){            $("<b>",{"text":otherTexts[0]}).insertBefore(jSpan);            $("<b>",{"text":otherTexts[1]}).insertAfter(jSpan);          }else{            if(index === 0){              $("<b>",{"text":otherTexts[0]}).insertAfter(jSpan);            }else{              $("<b>",{"text":otherTexts[0]}).insertBefore(jSpan);            }          }        }else{          jSpan.text(text);        }        isRender = true;        if(_event.itemBeforeRender){          isRender = _event.itemBeforeRender({"jthis":jthis,"jItem":jItem,"item":item});        }        if(isRender !== false){          jResult.append(jItem);          if(_event.itemAfterRender){            _event.itemAfterRender({"jthis":jthis,"jItem":jItem,"item":item});          }        }        _cache.push(item);      }      if(_event.endRender){        _event.endRender({"jthis":jthis});      }      jResult.show();    }    function attrValue(value){      if(!value && value != ""){        return $.trim(jthis.val());      }      jthis.val(value);    }    function splitText(text,value,index){      var tlength = text.length;      var vlength = value.length;      if(index === -1){        return null;      }      if(index === 0){        if(index + vlength >= tlength){          return null;        }        return [text.substr(index + vlength)];      }      if(index + vlength >= tlength){        return [text.substr(0,index)];      }      return [text.substr(0,index),text.substr(index + vlength)];    }  }})(window,jQuery);

樣式

.intellResult{margin:0;padding:0;background:#fff;border:1px solid #b6b6b6;clear:both;z-index:999;display:none;}.intellResult li{margin:0;padding:0;padding:5px 15px;height:20px;line-height:20px;overflow:hidden;text-overflow:ellipsis;cursor:pointer;white-space:nowrap;}.intellResult li.cur{background:#E5E0E0;}

以上就是本文的全部內容,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国内精品视频| 日韩av在线影院| 欧美高清不卡在线| 欧美日韩国产精品一区二区三区四区| 狠狠操狠狠色综合网| 在线观看91久久久久久| 亚洲欧美日本伦理| 欧美日韩在线第一页| 成人精品一区二区三区电影免费| 色老头一区二区三区| 日韩欧美中文字幕在线观看| 国产日韩在线视频| 国产网站欧美日韩免费精品在线观看| 国模精品一区二区三区色天香| 亚洲精品美女网站| 午夜精品免费视频| 国产精品国产三级国产专播精品人| 992tv成人免费视频| 日韩欧美亚洲一二三区| 亚洲男人av在线| 久久成年人视频| 国外成人在线视频| 亚洲在线免费视频| 午夜欧美大片免费观看| 久久久视频免费观看| 欧美精品电影免费在线观看| 成人在线视频网| 国产91热爆ts人妖在线| 欧美日韩另类字幕中文| 成人免费网站在线观看| 伦伦影院午夜日韩欧美限制| 一区二区三区精品99久久| 欧美亚洲午夜视频在线观看| 久久国产精品电影| 亚洲3p在线观看| 日韩久久午夜影院| 尤物精品国产第一福利三区| 国产精品久久久久久超碰| 欧美色videos| 97超级碰在线看视频免费在线看| 久久精品成人欧美大片| 热久久免费国产视频| 久久精品免费电影| 91久久精品日日躁夜夜躁国产| 91在线免费观看网站| 一本色道久久88精品综合| 亚洲一区二区三区在线免费观看| 日韩av三级在线观看| 精品无人区太爽高潮在线播放| 亚洲欧美一区二区三区情侣bbw| 色爱av美腿丝袜综合粉嫩av| 久久五月天色综合| 欧美成人久久久| 中文日韩在线观看| 91精品国产自产在线观看永久| 国产一区二区三区在线看| 日韩成人av在线播放| 国产97在线亚洲| 日韩av电影手机在线| 亚洲女人天堂网| 亚洲日本欧美中文幕| 51色欧美片视频在线观看| 国产精品久久久久免费a∨| 成人性生交xxxxx网站| 欧美三级欧美成人高清www| 欧美一区二区大胆人体摄影专业网站| 久久视频国产精品免费视频在线| 国产成人亚洲综合91精品| 成人在线小视频| 91精品在线观| 欧美老女人bb| 久久最新资源网| 日韩av免费一区| 亚洲欧美色图片| 欧美激情一级二级| 中文日韩电影网站| 亚洲最大的av网站| 日韩中文在线视频| 91精品国产色综合久久不卡98| 欧美专区在线观看| 国内成人精品一区| 日韩欧中文字幕| 日韩中文字幕免费视频| 91久久中文字幕| 91日本视频在线| 亚洲第一视频在线观看| 国产精品久久久久久久久久久久久| 91精品视频在线看| 日韩精品福利在线| 成人黄色生活片| 色综合男人天堂| 国产精品高清在线| 久久香蕉国产线看观看网| 欧美中文在线免费| 国产精品久久电影观看| 97精品久久久中文字幕免费| 亚洲一区二区福利| 国产在线精品自拍| 超碰日本道色综合久久综合| 精品露脸国产偷人在视频| 欧美激情视频给我| 精品国内亚洲在观看18黄| 国产欧美日韩免费| 亚洲欧美日韩在线一区| 欧美日韩美女在线| 国产精品中文字幕在线观看| 欧美三级免费观看| 欧美性猛交xxxx免费看久久久| 亚洲va久久久噜噜噜久久天堂| 久久综合久中文字幕青草| 亚洲а∨天堂久久精品喷水| 亚洲人成网7777777国产| 一本色道久久88综合日韩精品| 成人字幕网zmw| 性色av香蕉一区二区| 69av视频在线播放| 欧美激情精品久久久久| 欧美精品videos| 成人免费自拍视频| 国产成人精品免费视频| 蜜臀久久99精品久久久久久宅男| 久久男人的天堂| 国产91久久婷婷一区二区| 日韩欧美成人区| 高清一区二区三区日本久| 青草青草久热精品视频在线观看| 亚洲第一精品自拍| 91丝袜美腿美女视频网站| 91美女片黄在线观| 久久久久久久久久久免费精品| 欧美激情视频网站| 国产91精品高潮白浆喷水| 大胆人体色综合| 日韩亚洲成人av在线| 红桃视频成人在线观看| 国产男女猛烈无遮挡91| 欧美成人在线免费视频| 色爱精品视频一区| 91精品国产色综合| 亚洲毛片在线看| 欧美日韩国产成人| 亚洲人成在线观看网站高清| 精品调教chinesegay| 91精品国产91久久久久福利| 美女福利精品视频| 亚洲成人免费网站| 国外成人免费在线播放| 国产精品欧美亚洲777777| 久久伊人精品一区二区三区| 国产精品网址在线| 国产精品成人av性教育| 国产91久久婷婷一区二区| 国产精品久久电影观看| 久久全球大尺度高清视频| 久久久久久国产三级电影| 亚洲激情在线视频| 国产免费一区二区三区在线观看| 欧美成人三级视频网站| 国外成人免费在线播放| 久青草国产97香蕉在线视频| 在线视频欧美日韩精品| 亚洲成人精品视频在线观看| 欧美大全免费观看电视剧大泉洋| 成人情趣片在线观看免费|