- jQuery.fn.extend({
- jComplete:function(ID,url) {
- var key="#"+ID;//输入框ID
- var kurl=url;//异步交互URL
- var keword=$(key).get(0).name;//参数名称
- $(key).attr('autocomplete','off');//设置浏览器的自动提示关闭
- var $autocomplete=$('<div id=/"smallContent/"></div>').hide().insertAfter(key);
- var selectedItem=null;//当前选中项
- var setSelectedItem=function(item){//设置但前选中项setSelectedItem(item)
- selectedItem=item;
- if(selectedItem===null){
- $autocomplete.hide();
- return;
- }
- /*不能循环选择的代码
- if(selectedItem<0){
- selectedItem=0;
- }
- if(selectedItem>=$autocomplete.children().find('li').length){
- selectedItem=$autocomplete.children().find('li').length-1;
- }*/
- if(selectedItem<0){
- selectedItem=$autocomplete.children().find('li').length-1;
- }
- if(selectedItem>=$autocomplete.children().find('li').length){
- selectedItem=0;
- }
- $autocomplete.children().find('li').removeClass('hov').eq(selectedItem).addClass('hov');
- $autocomplete.show();
- }
- $(key).keyup(function(event){
- event||(event=window.event);//为了兼容浏览器,如果没有这个,只适用于IE
- if(event.keyCode>40||event.keyCode==8||event.keyCode==32||event.keyCode==13){
- /*
- 代码为40和以下的键,是特殊键,包括(回车,方向,退出等)
- 8为Backspace键
- 32为空格[为了适应中文输入法]
- 13为回车[为了适应中文输入法]
- */
- if(event.keyCode==13)//回车键
- {
- $(key).val($autocomplete.children().find("li").eq(selectedItem).html());
- $autocomplete.hide();
- $("form").submit(function(){return false});//阻止页面提交
- }
- selectedItem=null;//重置一下选中项,由于它是一个全局变量
- $.ajax({
- type: "GET",
- url:kurl,
- //data:"keyword="+encodeURI($(key).val()), //另一种书写形式
- data:{keyword:encodeURI($(key).val())},
- success: function(data){
- if(data!="") {
- $autocomplete.empty();
- var text="<ul>"+data+"</ul>";
- $autocomplete.html(text);
- if($autocomplete.children().find('li').length<1)//当没有加载数据的时候隐藏
- {$autocomplete.hide();}
- /**/
- $autocomplete.children().find('li').mouseover(function(){//这里实现的是鼠标选取,与下面的冲突,故把下面的注释掉
- setSelectedItem($autocomplete.children().find('li').index(this));
- //alert(selectedItem);
- }).click(function(){//实现鼠标点击,选择自动提示的内容
- //$(key).get(0).value = $(this).html();
- $(key).val($autocomplete.children().find("li").eq(selectedItem).html());
- //$("form").get(0).submit(); //鼠标点击提交页面
- $autocomplete.hide();
- return;
- }).mouseout(function(){//这里实现鼠标移出,自动提示框
- $(this).removeClass("hov");
- });
- /**/
- $autocomplete.show();
- }//end if
- else{
- $autocomplete.hide();
- } //end else
- }//end function(data)
- });//end $.ajax
- }//end if(event.keyCode>40||event.keyCode==8)
- else if(event.keyCode==27){//退出ESC
- $(key).val("");
- $autocomplete.hide();
- }
- else if(event.keyCode==38)//上方向键
- {
- //alert('你选择了上方向键');
- if($(key).val()==""){//用于阻止,直接按下方向键,载入原来的数据
- $autocomplete.empty();
- $autocomplete.hide();
- }
- if($autocomplete.children().find('li').length<1){//如果没有找到li,不显示下面的div
- $autocomplete.empty();
- $autocomplete.hide();
- }
- else{
- setSelectedItem(selectedItem-1);
- $(key).val($autocomplete.children().find("li").eq(selectedItem).html());
- }
- }
- else if(event.keyCode==40)//下方向键
- {
- //alert('你选择了下方向键')
- if($(key).val()==""){//用于阻止,直接按下方向键,载入原来的数据
- $autocomplete.empty();
- $autocomplete.hide();
- }
- if($autocomplete.children().find('li').length<1){//如果没有找到li,不显示下面的div
- $autocomplete.empty();
- $autocomplete.hide();
- }
- else{
- if(selectedItem===null){//如果没有这个判断,而直接写esle里面的语句,那么第一次就按下方向键,会直接选择第二个,我猜是因为null+1=1吧
- setSelectedItem(0);
- }else{
- setSelectedItem(selectedItem+1);
- }
- $(key).val($autocomplete.children().find("li").eq(selectedItem).html());
- }
- }
- });//end keyup
- $(key).blur(function(){//点击一下文档其他地方,取消提示[其实就是鼠标移出,文本框的时候,提示取消]
- if(selectedItem===null){
- $autocomplete.hide();
- return;
- }
- selectedDiv = $autocomplete.children().find(".hov");
- if(selectedDiv.length<1){
- $autocomplete.hide();
- return;
- }
- });//end $(key).blur
- }}); //end all
jQuery自己写的一个类似google自动提示的插件,源代码奉上
最新推荐文章于 2021-02-08 13:27:01 发布