`

Email自动完成控件

阅读更多
简介:根据用户输入文本框的内容在下方弹出一个完整Email列表供用户选择;用户可以按上下键进行选择,可以按回车键选中,也可以用鼠标点击选中;附件是一个小例子


/**
 * 根据用户键入内容生成下方提示邮箱列表,主要功能:
 * 1.支持按键上、下键循环选择
 * 2.支持回车选中内容
 * 3.支持鼠标选中内容
 * 4.失去焦点时获取当前选择内容
 * 特点:
 * 1.采用绝对定位,不用担心布局问题
 * 2.基于ext-core 3.0支持主流浏览器
 * BUG;
 * 1.ie6下出现的滚动条时会挡住最下方提示内容
 * 2.ie6、chrome不能通过拖动横向滚动条查看全部提示
 * 3.ie6下样式有点小问题
 * 
 * @author chemzqm@gmail.com
 * @version 1.0
 * @since 2010-4-8
 */
Ext.ns('Ext.ux');

Ext.ux.EmailTip = Ext.extend(Ext.util.Observable, {
    suffix: ['126.com', '163.com', 'gmail.com'],
    pattern: /^(\w+)([\-+.][\w]+)*$/,
    editing: false,//编辑状态标实
    KEYUP: 38,
    KEYDOWN: 40,
    KEYENTER: 13,
    constructor: function(elId, config){
        config = config || {};
        Ext.apply(this, config);
        Ext.ux.EmailTip.superclass.constructor.call(this, config);
        this.el = Ext.get(elId);
        this.initEvents();
    },
    initEvents: function(){
        this.el.on('keyup', function(e, t, o){
            e.preventDefault();
            if (this.editing) {
                switch (e.getKey()) {
                    case this.KEYUP:
                        this.moveSelect(false);
                        return;case this.KEYDOWN:
                        this.moveSelect(true);
                        return;case this.KEYENTER:
                        this.setSelectedValue();
                        return;default:
                        this.showTipes();
                }
            }
            else {
                this.showTipes();
            }
        }, this);
        this.el.on('blur', this.setSelectedValue, this);
    },
    setSelectedValue: function(set){
        if (!this.editing) 
            return;
        this.editing = false;
        var sDom = this.tipDiv.child('.hover');
        if (sDom && set !== false) 
            this.el.dom.value = sDom.child('li').dom.innerHTML;
        this.tipDiv.removeAllListeners();
        this.tipDiv.dom.innerHTML = '';
        this.tipDiv.hide();
    },
    moveSelect: function(isDown){
        var items = this.tipDiv.select('li');
        var startindex = 0;
        var count = items.getCount();
        var find = false;
        items.each(function(el, th, index){
            if (el.parent().hasClass('hover')) {
                startindex = (count + index +(isDown ? 1 : -1)) % count;
                find = true;
                return false;
            }
        });
        startindex = (!find && !isDown) ? count - 1 : startindex;
        items.item(startindex).parent().radioClass('hover');
    },
    /**
     * 获取列表数组,没有时返回空数组
     */
    getTipList: function(){
        var value = this.el.dom.value;
        var values = value.split('@');
        if (!this.pattern.exec(values[0])) {//用户名不合法
            return [];
        }
        var list = [];
        if (value.indexOf('@') != -1) {
            Ext.each(this.suffix, function(str){
                if (!values[1]) {//只有@没有后缀
                    list.push(values[0] + '@' + str);
                }
                else 
                    if (str.indexOf(values[1]) == 0)//后缀匹配 
                        list.push(values[0] + '@' + str);
            });
        }
        else {
            Ext.each(this.suffix, function(str){
                list.push(values[0] + '@' + str)
            });
        }
        return list;
    },
    showTipes: function(){
        var Helper = Ext.DomHelper;
        if (!this.tipDiv) {
            this.tipDiv = Helper.insertAfter(this.el, {
                tag: 'div',
				cls:'tipDiv'
            }, true);
            this.tipDiv.setStyle({
                top: this.el.getY() + this.el.getHeight() + 'px',
                left: this.el.getX() + 'px',
                width: this.el.getWidth() - 2 + 'px'
            });
        }
        this.tipDiv.removeAllListeners();
        this.tipDiv.dom.innerHTML = '';
        var list = this.getTipList();
        if (list && list.length != 0) {
            Ext.each(list, function(tip){
               Helper.append(this.tipDiv, {
                    tag: 'li',
                    cls: 'tips',
                    html: tip
                }, true).wrap();
				if(Ext.isIE6){
					//TODO ie6滚动条会挡住内容,暂时无法解决
				}
            }, this);
            this.tipDiv.on('mouseover', function(e, t){
                Ext.fly(t).parent().radioClass('hover');
            }, this, {
                delegate: 'li'
            });
            this.tipDiv.show();
            this.editing = true;
        }
        else {
            this.tipDiv.hide();
            this.editing = false;
        }
    }
});

.hover{
				background-color:#0464BB;
			}
			.tipDiv{
				position:absolute;
				background-color:white;
				border:1px solid black;
				z-index:999;
				height:auto;
                overflow:auto;
			}
			.tipDiv li{
				list-style:none;
				display:inline;
				cursor:pointer;
			}
			.tipDiv div{
				height:18px;
				margin:0px;
			}
  • 大小: 7.5 KB
2
0
分享到:
评论

相关推荐

    VB编程资源大全(控件 网络)

    1,abkemail.ZIP 简单的email控件(18KB ) 2,abkpop.ZIP 一个简单的POP3控件(5KB) 3,winpopup.ZIP 允许您的 VB 程序通过网络发送和接收 Winpopup 信息(20KB) 4,autodial.ZIP 自动拨号的控件(30...

    Visual C++ 编程资源大全(控件 网络)

    1,abkemail.ZIP 简单的email控件(18KB ) 2,abkpop.ZIP 一个简单的POP3控件(5KB)<END><br>3,winpopup.ZIP 允许您的程序通过网络发送和接收 Winpopup 信息(20KB)<END><br>4,autodial.ZIP 自动拨号的...

    皮肤控件研究文档,破解后的库文件,皮肤设计工具使用教程

    皮肤组件能完全自动的为您的应用程序添加支持换肤功能,甚至不需要更改您的设计好的Form以及添加一行代码!您 也不再需要花费很多时间来使得自己的应用程序更漂亮。 3 选择皮肤组件产品时需要考虑的几个因素: 3.1...

    uCGUIBuilder4.0

    5、添加代码自动完成功能; 6、添加画线功能。 version : 3.1.0.0 1、修改了选择不同窗体属性窗口不更新的BUG; 2、修改了只能打开一个ucGUIBuilder的功能,现在可以同时启动多个; 3、修复了拖放非ucfrm引起软件...

    点晴OA办公系统(免费版)半自动安装包 v16.1025A

    点晴OA系统提供:通知、会议、工作流、事务管理、改善提案、财务记账、文件服务器、Email管理、人力资源管理、通讯录、个人备忘录、即时通讯、5S和其他一些公共服务的小模块。 点晴MIS系统手工安装安装步骤 一、 ...

    串口调试助手Delphi SPCOMM版V1.1(含源码)

    由于改用COMPORT控件为SPCOMM控件,整个代码已经经过大规模的改动,去除了Email等与程序应用不太相关的部分,改进了绝大部分算法,添加原未完成的功能 ,程序依然是参照龚建伟VC版《串口调试助手V2.2》来编写的。...

    一款很好用的串口调试工具

    由于改用COMPORT控件为SPCOMM控件,整个代码已经经过大规模的改动,去除了Email等与程序应用不太相关的部分,改进了绝大部分算法,添加原未完成的功能 ,程序依然是参照龚建伟VC版《串口调试助手V2.2》来编写的。...

    Mindsware动态数据对象平台v0.2版发布

    不用再写SQL语句,不用再绑定参数,一切都是自动完成。5、有一个专门Render表格的类,用于根据DBObject/MultiDBObject的子类的schema生成 各种表单,例如新增数据表单、修改数据表单(会load被修改的数据)、查询...

    Access2000 Resize窗体自适应程序access2000

    这是针对access2000所做的自动调整窗体和控件大小的控件,使你的窗口在缩放的时候各控件位置和大小会自动调整。这样你的程序即可在640*480分辨率下运行,也可在800*600下运行,而且在任何大小情况下,窗体里的控件...

    Access97 Resize窗体自适应程序access2000

    说 明: 〖accResize1.0〗<BR><BR>这是针对access97所做的自动调整窗体和控件大小的控件,使你的窗口在缩放的时候各控件位置和大小会自动调整。这样你的程序即可在640*480分辨率下运行,也可在800*600下运行,而且在...

    Form Class Scaner (BCB/Delphi窗体类扫描机)

    本程序中用到的SkyEdit、SkyParser控件是我去年底完成的彩色语法显示编辑器控件(地址:http://www.2ccc.com/article.asp?articleid=1764),你可在本站下载。 最后声明一下,这个东东属于自由软件,所以你爱怎么用它...

    jQuery 表单验证插件

    对中文、英文、数字、整数、实数、Email地址格式、基于HTTP协议的网址格式、电话号码格式、手机号码格式、货币格式、邮政编码、身份证号码、QQ号码、日期等等这些控制,别的表单校验控件是代码里写死的,而...

    jQuery formValidator表单验证插件示例源码

    对中文、英文、数字、整数、实数、Email地址格式、基于HTTP协议的网址格式、电话号码格式、手机号码格式、货币格式、邮政编码、身份证号码、QQ号码、日期等等这些控制,别的表单校验控件是代码里写死的,而...

    超实用的jQuery代码段

    第5章 jQuery实现用户输入自动完成功能 5.1 最简单的用户输入自动完成 5.2 使用远程数据源的自动完成 5.3 带缓存的自动完成 5.4 带滚动条的自动完成 5.5 Combobox风格的自动完成 5.6 读取XML数据的自动完成 5.7 多维...

    Android基础知识详解

    AutoComplteteTextView、MultiAutoCompleteTextView (自动完成输入内容) 61 Button 63 ImageButton 65 ZoomButton 65 日期和时间控件 66 DatePicker、TimePicker 66 AnalogClock、DigitalClock 68 单选框、复选框、...

    《程序天下:JavaScript实例自学手册》光盘源码

    22.4 输入框自动完成功能 22.5 Ajax效果的字符串过滤 22.6 Gmail右上角的Loading效果 22.7 使用XMLHTTP获取天气预报 22.8 拖拽任意对象 22.9 避免打开无效页面 22.10 用JavaScript调用Google AdSense 22.11 Ajax效果...

    程序天下:JavaScript实例自学手册

    22.4 输入框自动完成功能 22.5 Ajax效果的字符串过滤 22.6 Gmail右上角的Loading效果 22.7 使用XMLHTTP获取天气预报 22.8 拖拽任意对象 22.9 避免打开无效页面 22.10 用JavaScript调用Google AdSense 22.11 Ajax效果...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例149 使用SwingWorker类完成耗时操作 194 第7章 反射与异常处理 195 7.1 反射的基础 196 实例150 实例化Class类的5种方式 196 实例151 获得Class对象表示实体的名称 197 实例152 查看类的声明 198 实例153 查看类...

Global site tag (gtag.js) - Google Analytics