ext-2.0扩展多选下拉框(代码及演示)

说明:

感谢飞天色鼠和javaeye论坛的sp2,其实是改了飞天色鼠的代码。sp2给了很大帮助,感谢!

演示效果:

 ms

调用代码如下:

var auto_field=new Ext.form.MultiSelectField();
if(contextlist==null)
{
    auto_field.contextArray=
    [
      ['1','一'],
      ['2','二'],
      ['3','三']
    ]
}
else
{
    auto_field.contextArray=contextlist;
}
auto_field.fieldLabel=text;
auto_field.id=id;
auto_field.name=id;
return auto_field;

代码如下:

Ext.form.MultiSelectField = Ext.extend(Ext.form.TriggerField,  {  
    readOnly : true ,  
    defaultAutoCreate : {tag: "input", type: "text", size: "24", autocomplete: "off"},  
    displayField : 'text', 
    contextArray: undefined, //必须满足每行至少两列,第一、二列分别为[value,text]
    valueField : undefined,  
    hiddenName : undefined,  
    listWidth : undefined,  
    minListWidth : 50,  
    layerHeight : undefined,  
    minLayerHeight : 60,  
    value : undefined,  
    baseParams : {},  
    checkpanel:undefined,
    initComponent : function()
    {  
            Ext.form.MultiSelectField.superclass.initComponent.call(this);  
            this.addEvents
            (  
                    'select',  
                    'expand',  
                    'collapse',  
                    'beforeselect'       
            );  
            if(this.transform)
            {  
                this.allowDomMove = false;  
                var s = Ext.getDom(this.transform);  
                if(!this.hiddenName)
                {  
                    this.hiddenName = s.name;  
                }  
                s.name = Ext.id();   
                if(!this.lazyRender)
                {  
                    this.target = true;  
                    this.el = Ext.DomHelper.insertBefore(s, this.autoCreate || this.defaultAutoCreate);  
                    Ext.removeNode(s);   
                    this.render(this.el.parentNode);  
                }else{  
                    Ext.removeNode(s);   
                }  
            }  
    },  
    onRender : function(ct, position)
    {  
        Ext.form.MultiSelectField.superclass.onRender.call(this, ct, position);  
        if(this.hiddenName)
        {  
            this.hiddenField = this.el.insertSibling({tag:'input', type:'hidden', name: this.hiddenName, id: (this.hiddenId||this.hiddenName)},  
                    'before', true);  
            this.hiddenField.value =  
                this.hiddenValue !== undefined ? this.hiddenValue :  
                this.value !== undefined ? this.value : '';  
            this.el.dom.removeAttribute('name');  
        }  
        if(Ext.isGecko){  
            this.el.dom.setAttribute('autocomplete', 'off');  
        }  
        this.initList();  
    },  
    initList : function()
    {  
        if(!this.list)
        {  
            var cls = 'x-multiselectfield-list';  
            this.list = new Ext.Layer
            ({  
                shadow: this.shadow, cls: [cls, this.listClass].join(' '), constrain:false  
            });  
            var lw = this.listWidth || Math.max(this.wrap.getWidth(), this.minListWidth);  
            this.list.setWidth(lw);  
            this.list.swallowEvent('mousewheel');  
            this.innerList = this.list.createChild({cls:cls+'-inner'});  
            this.innerList.setWidth(lw - this.list.getFrameWidth('lr'));  
            this.innerList.setHeight(this.layerHeight || this.minLayerHeight);  
            if(!this.checkpanel)
            {  
                this.checkpanel = this.CheckPanel(this.innerList);      
            }  
            this.checkpanel.render();  
        }  
    },  
    onSelect:function(id,text,checked)
    {  
            this.setValue(id,text,checked);  
    },  
    CheckPanel:function(el)
    {  
        var checkpanel = new Ext.Panel
        ({  
            el:el,  
            autoScroll:true
        }); 
        var multiselectField = this;
        if(typeof this.contextArray != 'undefined')
        {
            for(var i=0;i            {
                var contArry=this.contextArray[i];
                var auto_field=new Ext.form.Checkbox
                ({
                    boxLabel:contArry[1],
                    id:contArry[0],
                    name:contArry[0],
                    cls :'x-multiselectfield-list'
                });
                auto_field.on('check',function(auto_field)
                {  
                    multiselectField.onSelect(auto_field.id,auto_field.boxLabel,auto_field.checked);
                });  
                checkpanel.add(auto_field);          
            }
        }
        return checkpanel
    },  
    getValue : function()
    {  
        if(typeof this.value != 'undefined')
        {  
            return this.value;  
        }
        else
        {  
            return Ext.form.MultiSelectField.superclass.getValue.call(this);  
        }  
    },  
    setValue : function(id,text,ischecked)
    {  
        var text = text;  
        var value = id; 
        var return_text_string;
        var return_value_string;

        var text_temp    = Ext.form.MultiSelectField.superclass.getValue.call(this); 
        var ids_temp     = typeof this.value != 'undefined' ? this.value : '';
        var text_arrtemp = text_temp.split(",");
        var ID_arrtemp   = ids_temp.split(",");
        if(ischecked)
        {     
            Array.add(text_arrtemp,text);
            Array.add(ID_arrtemp,value);
        }
        else
        {
            Array.remove(text_arrtemp,text);
            Array.remove(ID_arrtemp,value);      
        }
        return_text_string  = text_arrtemp.toString();
        return_value_string = ID_arrtemp.toString();
        var first_text_str  = return_text_string.substr(0,1);
        var first_value_str = return_value_string.substr(0,1);
        if(first_text_str==",")
        {
          return_text_string=return_text_string.substr(1);
        }
        if(first_value_str==",")
        {
          return_value_string=return_value_string.substr(1);
        }
        Ext.form.MultiSelectField.superclass.setValue.call(this, return_text_string);  
        this.value = return_value_string;
        if(this.hiddenField)
        {  
            this.hiddenField.value = return_value_string;  
        }  

    },    
    onDestroy : function()
    {  
        if(this.list)
        {  
            this.list.destroy();  
        }  
        Ext.form.MultiSelectField.superclass.onDestroy.call(this);  
    },  
    collapseIf : function(e)
    {  
        if(!e.within(this.wrap) && !e.within(this.list))
        {  
            this.collapse();  
        }  
    },  
    expand : function()
    {  
        if(this.isExpanded() || !this.hasFocus)
        {  
            return;  
        }  
        this.list.alignTo(this.wrap, this.listAlign);  
        this.list.show();  
        Ext.getDoc().on('mousewheel', this.collapseIf, this);  
        Ext.getDoc().on('mousedown', this.collapseIf, this);  
        this.fireEvent('expand', this);  
    },  
    collapse : function()
    {  
        if(!this.isExpanded())
        {  
            return;  
        }  
        this.list.hide();  
        Ext.getDoc().un('mousewheel', this.collapseIf, this);  
        Ext.getDoc().un('mousedown', this.collapseIf, this);  
        this.fireEvent('collapse', this);  
    },  
    isExpanded : function()
    {  
        return this.list && this.list.isVisible();  
    },  
    onTriggerClick : function()
    {  
        if(this.disabled)
        {  
            return;  
        }  
        if(this.isExpanded())
        {  
            this.collapse();  
        }
        else
        {  
            this.onFocus({});  
            this.expand();  
        }  
        this.el.focus();  
    }  
});  
Ext.reg('multiselectfield', Ext.form.MultiSelectField);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
xm-select 是一个基于 layui 的下拉框组件,可以实现多选、搜索、异步加载等功能。下面是一个简单的示例代码: ```html <div class="layui-form-item"> <label class="layui-form-label">多选下拉框</label> <div class="layui-input-block"> <select xm-select="demo2" xm-select-max="3" xm-select-search xm-select-skin="default" name="city[]" lay-verify="required" multiple> <option value="0">北京</option> <option value="1">上海</option> <option value="2">广州</option> <option value="3">深圳</option> <option value="4">杭州</option> <option value="5">南京</option> <option value="6">武汉</option> <option value="7">成都</option> </select> </div> </div> ``` 其中,`xm-select` 属性指定了下拉框的 ID,`xm-select-max` 属性指定了最多可选项数,`xm-select-search` 属性表示开启搜索功能,`xm-select-skin` 属性指定了皮肤样式,`multiple` 属性表示开启多选。 在 JavaScript 中,我们需要使用 `xmSelect` 函数初始化下拉框,并设置各种配置项: ```javascript layui.use(['xmSelect'], function(){ var xmSelect = layui.xmSelect; var demo2 = xmSelect.render({ el: '#demo2', name: 'city', layVerify: 'required', filterable: true, searchPlaceholder: '请选择城市', tips: '最多选择3个城市', max: 3, data: [{ name: '北京', value: 0 }, { name: '上海', value: 1 }, { name: '广州', value: 2 }, { name: '深圳', value: 3 }, { name: '杭州', value: 4 }, { name: '南京', value: 5 }, { name: '武汉', value: 6 }, { name: '成都', value: 7 }] }); }); ``` 其中,`el` 属性指定了下拉框的 ID,`name` 属性指定了提交表单时的参数名,`layVerify` 属性指定了表单验证规则,`filterable` 属性表示开启搜索功能,`searchPlaceholder` 属性指定了搜索框的提示文本,`tips` 属性指定了超出可选项数时的提示文本,`max` 属性指定了最多可选项数,`data` 属性指定了下拉框的选项数据。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值