`

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
分享到:
评论

相关推荐

    EXT自动完成(此处为自动添加邮箱后缀,可以添加其他内容)

    EXT框架是一个基于JavaScript的富客户端应用开发库,它提供了丰富的组件库,包括我们这里讨论的“自动完成”控件。在EXT中,这种功能通常通过Combobox组件实现,它允许用户在输入文本时获取匹配的建议列表。 描述中...

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

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

    发送邮件和附件的免费控件&示例

    在IT行业中,发送电子邮件是日常工作中非常常见的任务,特别是在自动化和程序化通信中。这个"发送邮件和附件的免费控件&示例"提供了一种简单的方法,通过使用SMTP.OCX控件来实现这一功能。SMTP(Simple Mail ...

    根据NHibernate实体生成简单控件

    3. 控件生成:在GUI层面上,你可以编写代码自动生成UI控件,这些控件将与实体属性相对应。例如,对于`User`实体,你可以生成一个文本框用于显示/编辑`Name`,另一个文本框用于`Email`。这可以通过反射机制实现,遍历...

    asp.net的漂亮textbox控件

    通过调整属性,我们可以实现各种功能,例如限制输入长度、设置默认文本、开启或关闭自动完成等。以下是一些关键属性: 1. `Text`:这个属性用于获取或设置`TextBox`中显示的文本。 2. `MaxLength`:设置用户可以在...

    TextBox控件应用技巧

    TextBox控件还有许多其他高级特性,如密码框模式(通过`UseSystemPasswordChar`属性实现)、自动完成(`AutoCompleteMode`和`AutoCompleteSource`属性)和行号显示(`ScrollBars`属性)。对于多行文本框,可以使用`...

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

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

    MFC 通过outlook自动附加附件同时含有colorcombo实例

    这通常通过`CoInitializeEx`和`CoCreateInstance`函数完成。 2. **创建邮件对象**:使用Outlook的`Application`对象创建一个新的`MailItem`对象,这代表一封待发送的邮件。 3. **设置邮件属性**:可以调用`...

    jmail 发送邮件控件,支持winxp win200 win2003 版本4.3

    安装完成后,Jmail的相关库文件会自动添加到开发环境中。 2. **配置过程**:在应用程序中使用Jmail前,需要配置SMTP服务器信息,包括服务器地址、端口、用户名和密码等。这通常通过代码或配置文件实现。 三、Jmail...

    android常用控件

    - **AutoCompleteTextView**: 提供自动完成建议的 `EditText`。 - **CheckBox**: 一个可以勾选或取消勾选的文本视图。 - **CompoundButton**: 一种特殊的按钮,可以有一个选中状态,如 `CheckBox` 和 `RadioButton`...

    VB制作网页自动填表.doc

    VB制作网页自动填表是一个基础的计算机编程教程,主要涉及Visual Basic (VB)的WebBrowser控件和网页交互功能。WebBrowser控件是VB提供的一种组件,它允许开发者在应用程序中嵌入一个浏览器,从而能够加载和显示网页...

    email系统一个很好用的系统就是简单了点

    9. **API接口**:现代Email系统通常会提供API接口,允许开发者集成邮件服务到其他应用中,如自动化发送邮件、获取邮件信息等。 10. **可扩展性与性能**:随着用户数量的增长,Email系统需要有良好的可扩展性,以...

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

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

    Web-前端html+css从入门到精通 128. 表单扩展之新input控件.zip

    它可以帮助防止因用户输入错误导致的问题,同时也可以提供自动完成和格式化功能。 3. `type="tel"`:此类型用于电话号码输入,可以支持国际格式,并且可以进行简单的格式验证。 4. `type="date"`:允许用户选择...

    Qt QWebview调用JS,实现QQ邮箱自动填写输入框,模拟鼠标点击网页按钮!!

    在某些情况下,可能需要在JavaScript执行后监听特定的事件,例如表单提交或者页面加载完成。这时,可以在JavaScript中定义一个函数,然后通过`QWebFrame::addToJavaScriptWindowObject()`将该函数注册到全局...

    VB版Email收发检测程序

    一旦设置完成,程序会定期或者按需自动检查邮件,无需用户手动操作。描述中的“模仿MSN风格的弹出信息提示”意味着这个VB程序在检测到新邮件时,会像MSN Messenger(微软早期的即时通讯软件)那样,通过弹窗通知用户...

    jQuery实现自动输入email、时间和域名的方法

    在email自动输入的实现中,通过指定separator为"@"符号,来区分邮箱的用户名和域名部分,然后提供了一个预设的域名数组作为输入建议。 对于时间的自动输入,文章中通过编写filter函数来实现对时间的有效控制。...

    uCGUIBuilder4.0

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

Global site tag (gtag.js) - Google Analytics