jquery UIメールボックス自動補完

4847 ワード

《1》
自動補完(autocomplete)は、ユーザーが完全な情報を入力するのを減らすUIツールです.一般的には、メールボックスを入力したり、キーワードを検索したりして、ユーザーが選択できるように対応する完全な文字列を抽出します.
まず、jquery UIに導入する2つのパッケージのうち、1つはjquery-uiです.js、jquery-ui.css
<html>
<head>
    <title></title>
    <script src="js/jquery-1.11.2.js"></script>
    <script src="js/jquery-ui.js"></script>
    <link href="js/jquery-ui.css" rel="stylesheet" />
</head>
<body>
    <input id="email" type="text" />
</body>
</html>
<script type="text/javascript">
    $("#email").autocomplete({
        delay: 0, //   300   ,      。
        autoFocus:true, //   true  ,           。

        //request     ,      term ,term         。

        //response               :response(["aa","aaaa","aaaaaa","bb"])

        source: function (request, response) {

            var hosts = ["qq.com", "163.com", "263.com", "sina.com.cn", "gmail.com", "hotmail.com"];//      

            var term = request.term; //         ;
            var name = term;  //      
            var host = "";   //        qq.com
            var ix = term.indexOf('@'); //@   

            var result = []; //         

            

            //        (email)   @   ,            

            if (ix > -1) { //  @    ,             。
                name = term.slice(0, ix);
                host = term.slice(ix + 1);
            }

            if (name) { //  name    :   
                //        @           ,            ,  abc@1    [email protected]
                //         @      。              

                var getHosts = []; //             hosts           

                if (host) { //  host      
                    getHosts = $.grep(hosts, function (val, key) { //  getHosts  
                        if (val.indexOf(host) > -1) {
                            return val;
                        };
                    });
                }
                else {
                    getHosts = hosts;
                }
                

                var abc = $.map(getHosts, function (val) { //  val  getHosts        。
                    return name + "@" + val;
                });

                
                result.push(term);//       qq.com, 163.com       ,                       ,      [email protected]   ,        。    ,               result          

                result = result.concat(abc);//    abc        result                result      
                
            }

            //result.push(term); //      ,       term                。             。             
            
            //result.unshift(term); //      ; unshift      :                ,          ,       

            response(result);

        }
    });
</script>

上のコードを小さく最適化してみましょう
<html>
<head>
    <title></title>
    <script src="js/jquery-1.11.2.js"></script>
    <script src="js/jquery-ui.js"></script>
    <link href="js/jquery-ui.css" rel="stylesheet" />
</head>
<body>
    <input id="email" type="text" />
</body>
</html>
<script type="text/javascript">
    $("#email").autocomplete({
        delay: 0, //   300   ,      。
        autoFocus:true, //   true  ,           。
        source: function (request, response) {

            var hosts = ["qq.com", "163.com", "263.com", "sina.com.cn", "gmail.com", "hotmail.com"];//      

            var term = request.term; //         ;
            var name = term;  //      
            var host = "";   //        qq.com
            var ix = term.indexOf('@'); //@   

            var result = []; //         
            

            //        (email)   @   ,            

            if (ix > -1) { //  @    ,             。
                name = term.slice(0, ix);
                host = term.slice(ix + 1);
            }

            if (name) { //  name    :   

                var getHosts = []; //             hosts           
                
                getHosts=  host ? ($.grep(hosts, function (val) { return val.indexOf(host) > -1 })) : hosts;

                result = $.map(getHosts, function (val) { //  val  getHosts        。
                    return name + "@" + val;
                });                
            }          
            result.unshift(term); // unshift      :                ,          ,       

            response(result);

        }
    });
</script>