写一个JQuery输入自动补全的插件

自动补全是一个非常人性化的设计
服务器君一共花费了64.278 ms进行了4次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

自动补全是一个非常人性化的设计,可以为用户节省很多输入时间。自动补全是如何实现的呢?下面的程序可供参考。

感觉这个东西很常用,很多其它js框架里有,但是太大了,用不了太多,自己写了个。

下面是html测试代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>autoComplete</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <style type="text/css">
            .autoComplete {margin:8px;position:relative;float:left;}
            .autoComplete input{width:200px;height:25px;line-height:25px;margin:0;padding:0;}
            .autoComplete ul{z-index:99;padding:0px;margin:0px;border:1px #333 solid;width:200px;background:white;display:none;position:absolute;left:0;top:28px;}
            .autoComplete li{list-style:none;}
            .autoComplete li a {display:block;color:#000;text-decoration:none;padding:1px 0 1px 5px;}
            .autoComplete li a:hover {color:#000;background:#ccc;border:none;}
        </style>
        <script type="text/javascript" src="../javascript/lib/jquery-1.4.2.min.js"></script>
        <script type="text/javascript" src="../javascript/autoComplete.js"></script>
    </head>
    <body>
        <div class="autoComplete"> <input value="input" /> <ul><li></li></ul> </div>
        <div class="autoComplete"> <input value="input" /> <ul><li></li></ul> </div>
        <div class="autoComplete"> <input value="input" /> <ul><li></li></ul> </div>
        <div class="autoComplete"> <input value="input" /> <ul><li></li></ul> </div>
    </body>
</html>

下面是jQuery插件:

;(function($){
/* Plugin */
$.fn.autoComplete=function(o){
    if(o.ajax) o.ajax=$.extend({ url:'', dataType:'json', async:true }, o.ajax||{});
    o.elemCSS=$.extend({ focus:{'color':'#f00'}, blur:{'color':'#000'} }, o.elemCSS||{});
    o=$.extend({
        source:null,/* privide an array for match */
        ajax:{},/* provide an ajax conditions, if source is exist this parameter is invalid */
        input:'input',/* provide the selector of input box */
        popup:'ul',/* provide the selector of popup box, it must be a ul element of html */
        elemCSS:{}/* provide the focus and blur css objects of items in the popup box */
    },o||{});
    var handler=(function(){
        var handler=function(e,o){ return new handler.prototype.init(e,o); };
        handler.prototype={
            e:null, o:null, timer:null, show:0, $input:null, $popup:null,
            init:function(e,o){
                this.e=e;
                this.o=o;
                this.$input=$(this.o.input,this.e);
                this.$popup=$(this.o.popup,this.e);
                this.initEvent();
            },
            match:function(quickExpr,value,source){
                for(var i in source){
                    if( value.length>0 && quickExpr.exec(source[i])!=null )
                        this.$popup.append('<li><a href="javascript:;">'+source[i]+'</a></li>');
                }
                if($('li a',this.$popup[0]).length){ this.$popup.show(); }else{ this.$popup.hide(); }
            },
            fetch:function(ajax,search,quickExpr){
                var that=this;
                $.ajax({
                    url: ajax.url+search,
                    dataType: ajax.dataType,
                    async: ajax.async,
                    error: function(data,es,et){ alert('error'); },
                    success: function(data){ that.match(quickExpr,search,data); }
                });
            },
            initEvent:function(){
                var that=this;
                this.$input.focus(function(){
                    var value=this.value, quickExpr=RegExp('^'+value,'i'), self=this;
                    that.timer=setInterval(function(){
                        if(value!=self.value){
                            value=self.value;
                            that.$popup.html('');
                            if(value!=''){
                                quickExpr=RegExp('^'+value);
                                if(that.o.source) that.match(quickExpr,value,that.o.source);
                                else if(that.o.ajax) that.fetch(that.o.ajax,value,quickExpr);
                            }
                        }
                    },200);
                }).blur(function(){
                    clearInterval(that.timer);
                    var current=-1;
                    var len=that.$popup.find("li a").length-1;
                    $("li a",that.$popup[0]).click(function(){
                        that.$input[0].value=$(this).text();
                        that.$popup.html('').hide();
                    }).focus(function(){
                        current = $(this).parent().index();
                        $(this).css(that.o.elemCSS.focus);
                    }).blur(function(){
                        $(this).css(that.o.elemCSS.blur);
                    });
                    $("li a",that.$popup[0]).keydown(function(event){
                        if(event.keyCode==40){
                            current++;
                            if(current<0) current=len;
                            if(current>len) current=0;
                            that.$popup.find("li a").get(current).focus();
                        }else if(event.keyCode==38){
                            current--;
                            if(current>len) current=0;
                            if(current<0) current=len;
                            that.$popup.find("li a").get(current).focus();
                        }
                    });
                }).keydown(function(event){
                    if(event.keyCode==40){
                        that.$popup.blur().find("li a").get(0).focus();
                    }
                });
                $(this.e).hover(function(){ that.show=1; },function(){ that.show=0; });
                $(document).click(function(){ if(that.show==0){ that.$popup.hide(); } });
            }
        };
        handler.prototype.init.prototype=handler.prototype;/* JQuery style */
        return handler;
    })();
    return this.each(function(){ handler(this,o); });
};
/* Invoke */
$(document).ready(function(){
    $(".autoComplete").autoComplete({
        source:[123,1234,43563,12346,3464564,3454,7567,956,456,9383,893,999],
        //ajax:{ url:'./php/fetch.php?search=', dataType:'json', async:false },
        elemCSS:{ focus:{'color':'#0f0'}, blur:{'color':'#f00'} }
    });
});
/* Conclude */
})(jQuery);

调用时有个ajax请求被注释了,它返回一个json数据,我用php读mysql数据库来测试的,如果需要,代码如下:

<?php
class DataFetch{
    private $conn, $rs;
    function __construct(){
        $this->conn = mysql_connect("localhost","root","pwd") or die("Cant't connect host~");
        mysql_select_db("studentinfo",$this->conn) or die("Cant't select database~");
    }
    public function data_list($s){
        $this->rs=mysql_query("select sno from student where sno like '$s%'") or die("Can't fetch~");
        $dataList=array();
        while($row = mysql_fetch_array($this->rs,MYSQL_ASSOC)){
                array_push($dataList,$row);
        }
        return $dataList;
    }
}
$search= isset($argv[1]) ? $argv[1] :
   ( isset($_GET['search']) ? $_GET['search'] : '' ) ;
$fetch=new DataFetch();
$data=$fetch->data_list($search);
echo '[';
foreach ($data as $key=>$value){
    echo "\n\t";
    echo '"'.$value['sno'].'"';
    if( $key!=count($data)-1 ) echo ','; else echo "\n";
}
echo "]\n";
?>

本文地址:http://www.nowamagic.net/librarys/veda/detail/1026,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/1026

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《代码大全(第2版)》 史蒂夫•迈克康奈尔 (Steve McConnell) (作者), 金戈 (译者)

代码大全(第2版)是著名IT畅销书作者、《IEEE Software》杂志前主编、具有20年编程与项目管理经验的Steve McConnell十余年前的经典著作的全新演绎:第2版做了全面的更新,增加了很多与时俱进的内容,包括对新语言、新的开发过程与方法论的讨论等等。这是一本百科全书式的软件构建手册,涵盖了软件构建活动的方方面面,尤其强调提高软件质量的种种实践方法。

更多计算机宝库...