zoukankan      html  css  js  c++  java
  • javascript 邮箱输入自动补全插件(转)

    <!DOCTYPE HTML>
    <html>
        <head>
            <meta charset="utf-8">
            <title>inputSuggest_0.1.js</title>
            <style type="text/css">
                body{margin:0;padding:0;}
                input{200px;}
                .suggest-container{border:1px solid #C1C1C1;visibility:hidden;}
                .suggest-item{padding:3px 2px;}
                .suggest-active {background:#33CCFF;color:white;padding:3px 2px;}
            </style>
            <script type="text/javascript" >
            /**
     * JavaScript inputSuggest v0.1
     * Copyright (c) 2010 snandy
     * Blog: http://snandy.javaeye.com/
     * QQ群: 34580561
     * Date: 2010-09-25
     * Download by http://www.codefans.net
     *
     * new InputSuggest({
     *       input         HTMLInputElement 必选
     *       data             Array ['sina.cn','sina.com','2008.sina.com','vip.sina.com.cn'] 必选
     *       containerCls    容器className
     *       itemCls        容器子项className
     *       activeCls        高亮子项className
     *       width         宽度设置 此项将覆盖containerCls的width
     *    opacity        透明度设置 此项将覆盖containerCls的opacity
     * });
     */
    
    function InputSuggest(opt){
        this.win = null;
        this.doc = null;
        this.container = null;
        this.items = null;
        this.input = opt.input || null;
        this.containerCls = opt.containerCls || 'suggest-container';
        this.itemCls = opt.itemCls || 'suggest-item';
        this.activeCls = opt.activeCls || 'suggest-active';
        this.width = opt.width;
        this.opacity = opt.opacity;
        this.data = opt.data || [];
        this.active = null;
        this.visible = false;
        this.init();
    }
    InputSuggest.prototype = {
        init: function(){
            this.win = window;
            this.doc = window.document;
            this.container = this.$C('div');
            this.attr(this.container, 'class', this.containerCls);
            this.doc.body.appendChild(this.container);
            this.setPos();
            var _this = this, input = this.input;        
    
            this.on(input,'keyup',function(e){
                if(input.value==''){
                    _this.hide();
                }else{
                    _this.onKeyup(e);
                }
    
            });
            // blur会在click前发生,这里使用mousedown
            this.on(input,'blur',function(e){
                _this.hide();
            });
            this.onMouseover();
            this.onMousedown();
    
        },
        $C: function(tag){
            return this.doc.createElement(tag);
        },
        getPos: function (el){
            var pos=[0,0], a=el;
            if(el.getBoundingClientRect){
                var box = el.getBoundingClientRect();
                pos=[box.left,box.top];
            }else{
                while(a && a.offsetParent){
                    pos[0] += a.offsetLeft;
                    pos[1] += a.offsetTop;
                    a = a.offsetParent
                }
            }
            return pos;
        },
        setPos: function(){
            var input = this.input,
                pos = this.getPos(input),
                brow = this.brow,
                width = this.width,
                opacity = this.opacity,
                container = this.container;
            container.style.cssText =
                'position:absolute;overflow:hidden;left:'
                + pos[0] + 'px;top:'
                + (pos[1]+input.offsetHeight) + 'px;'
                // IE6/7/8/9/Chrome/Safari input[type=text] border默认为2,Firefox为1,因此取offsetWidth-2保证与FF一致
                + (brow.firefox ? input.clientWidth : input.offsetWidth-2) + 'px;';
            if(width){
                container.style.width = width + 'px';
            }
            if(opacity){
                if(this.brow.ie){
                    container.style.filter = 'Alpha(Opacity=' + opacity * 100 + ');';
                }else{
                    container.style.opacity = (opacity == 1 ? '' : '' + opacity);
                }
            }
        },
        show: function(){
            this.container.style.visibility = 'visible';
            this.visible = true;
        },
        hide: function(){
            this.container.style.visibility = 'hidden';
            this.visible = false;
        },
        attr: function(el, name, val){
            if(val === undefined){
                return el.getAttribute(name);
            }else{
                el.setAttribute(name,val);
                name=='class' && (el.className = val);
            }
        },
        on: function(el, type, fn){
            el.addEventListener ? el.addEventListener(type, fn, false) : el.attachEvent('on' + type, fn);
        },
        un: function(el, type, fn){
            el.removeEventListener ? el.removeEventListener(type, fn, false) : el.detachEvent('on' + type, fn);
        },
        brow: function(ua){
            return {
                ie: /msie/.test(ua) && !/opera/.test(ua),
                opera: /opera/.test(ua),
                firefox: /firefox/.test(ua)
            };
        }(navigator.userAgent.toLowerCase()),
        onKeyup: function(e){
            var container = this.container, input = this.input, iCls = this.itemCls, aCls = this.activeCls;
            if(this.visible){
                switch(e.keyCode){
                    case 13: // Enter
                        if(this.active){
                            input.value = this.active.firstChild.data;
                            this.hide();
                        }
                        return;
                    case 38: // 方向键上
                        if(this.active==null){
                            this.active = container.lastChild;
                            this.attr(this.active, 'class', aCls);
                            input.value = this.active.firstChild.data;
                        }else{
                            if(this.active.previousSibling!=null){
                                this.attr(this.active, 'class', iCls);
                                this.active = this.active.previousSibling;
                                this.attr(this.active, 'class', aCls);
                                input.value = this.active.firstChild.data;
                            }else{
                                this.attr(this.active, 'class', iCls);
                                this.active = null;
                                input.focus();
                                input.value = input.getAttribute("curr_val");
                            }
                        }
                        return;
                    case 40: // 方向键下
                        if(this.active==null){
                            this.active = container.firstChild;
                            this.attr(this.active, 'class', aCls);
                            input.value = this.active.firstChild.data;
                        }else{
                            if(this.active.nextSibling!=null){
                                this.attr(this.active, 'class', iCls);
                                this.active = this.active.nextSibling;
                                this.attr(this.active, 'class', aCls);
                                input.value = this.active.firstChild.data;
                               }else{
                                this.attr(this.active, 'class', iCls);
                                this.active = null;
                                input.focus();
                                input.value = input.getAttribute("curr_val");
                            }
                        }
                        return;
    
                }
    
            }
            if(e.keyCode==27){ // ESC键
                this.hide();
                input.value = this.attr(input,'curr_val');
                return;
            }
            if(input.value.indexOf('@')!=-1){return;}
            this.items = [];
    
            if(this.attr(input,'curr_val')!=input.value){
                this.container.innerHTML = '';
                for(var i=0,len=this.data.length;i<len;i++){
                    var item = this.$C('div');
                    this.attr(item, 'class', this.itemCls);
                    item.innerHTML = input.value + '@' + this.data[i];
                    this.items[i] = item;
                    this.container.appendChild(item);
                }
                this.attr(input,'curr_val',input.value);
            }
    
            this.show();
    
        },
        onMouseover: function(){
            var _this = this, icls = this.itemCls, acls = this.activeCls;
            this.on(this.container,'mouseover',function(e){
                var target = e.target || e.srcElement;
                if(target.className == icls){
                    if(_this.active){
                        _this.active.className = icls;
                    }
                    target.className = acls;
                    _this.active = target;
    
                }
            });
        },
        onMousedown: function(){
            var _this = this;
            this.on(this.container,'mousedown',function(e){
                var target = e.target || e.srcElement;
                _this.input.value = target.innerHTML;
                _this.hide();
            });
        }
    }    
    
            </script>
    
            <script type="text/javascript">
    
                window.onload = function(){
                    var sinaSuggest = new InputSuggest({
                        input: document.getElementById('sina'),
                        data: ['sina.cn','sina.com','vip.sina.com.cn','2008.sina.com','263.sina.com']
                    });
                    var sohuSuggest = new InputSuggest({
                         300,
                        opacity: 0.3,
                        input: document.getElementById('sohu'),
                        data: ['sohu.com','sogou.com','chinaren.com','vip.sohu.com','sohu.net','2008.sohu.com','sms.sohu.com']
                    });
    
                }
            </script>
        </head>
        <body>
            <div style="400px;margin:30px auto;text-align:center;">
                <label>新浪</label>
                <input type="text" id="sina"/>
                <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
                <label>搜狐</label>
                <input type="text" id="sohu"/>
            </div>
    
        </body>
    </html>
    
  • 相关阅读:
    Sprinig.net 双向绑定 Bidirectional data binding and data model management 和 UpdatePanel
    Memcached是什么
    Spring.net 网络示例 codeproject
    jquery.modalbox.show 插件
    UVA 639 Don't Get Rooked
    UVA 539 The Settlers of Catan
    UVA 301 Transportation
    UVA 331 Mapping the Swaps
    UVA 216 Getting in Line
    UVA 10344 23 out of 5
  • 原文地址:https://www.cnblogs.com/lenga/p/3912663.html
Copyright © 2011-2022 走看看