扩展DataView实现(MultiSelect)多行选择框
来源:互联网 发布:c语言while语句 编辑:程序博客网 时间:2024/03/29 01:38
Ext中有一个Combox组件,但缺少了多行选择框,也就是普通html中size大于0的select选择框。
在网上看到有很多朋友都需要这个组件,今日无聊,于是就简单的扩展了一个,共享给大家。同时再赞ext的强大!
目前支持如下功能:
1、键盘上下箭头导航。
2、键盘上下箭头选择某项保证该项可见(自动滚动滚动条以保证显示)。
3、初始化默认选中第一条记录。
4、通过ctrl或shift实现多项选择。(这个是dataView本身支持的)
以下是通过Extend基于dataView扩展实现的multiSelect的代码:
Ext.form.MultiSelect=Ext.extend(Ext.DataView,{
multiSelect:true,
tpl: new Ext.XTemplate( //view的模板
'<tpl for=".">',
'<div class="x-combo-list-item">{text}</div>',
'</tpl>'
),
style:'cursor:pointer;overflow:auto',
cls:'x-combo-list-inner',
ctCls:'x-combo-list',
overClass:'x-view-over',
selectedClass:'x-combo-selected',
itemSelector:'div.x-combo-list-item',
initComponent:function(){
Ext.form.MultiSelect.superclass.initComponent.call(this);
},
onRender:function(){
Ext.form.MultiSelect.superclass.onRender.apply(this,arguments);
var _this=this;
this.el.dom.onselectstart=function(){return false} //防止鼠标选择
new Ext.KeyNav(this.el, {
"up" : function(e){
var selIndex=_this.getSelectedIndexes()[0]-1;
var index=selIndex>-1?selIndex:_this.store.getCount()-1;
_this.select(index);
},
"down" : function(e){
var selIndex=_this.getSelectedIndexes()[0]+1;
var index=selIndex==_this.store.getCount()?0:selIndex;
_this.select(index);
}
})
//定位选中项保证可见
this.on('selectionchange',function(t,node){ //定位选中项保证可见
if(!(node=node[0]))return;
var ct=this.el.dom,barHeight=0,diff;
var ctSt=ct.scrollTop,nodeOft=node.offsetTop;
if(ct.offsetHeight-ct.clientHeight>5){
barHeight=16;
}
var cntPos=[ctSt,ctSt+ct.offsetHeight-barHeight];
var nodePos=[nodeOft,nodeOft+node.offsetHeight];
if(nodePos[0]<cntPos[0]){
ct.scrollTop=nodeOft;
}
if((diff=nodePos[1]-cntPos[1])>0){
ct.scrollTop=ctSt+diff+2;
}
});
//选中第一行
var selectFirst=function(){
setTimeout(function() {
_this.select(0)
}, 1)
};
selectFirst();
this.store.on('load',selectFirst)
}
});
使用示例(JS):
Ext.onReady(function(){
var store=new Ext.data.Store({
proxy: new Ext.data.MemoryProxy(),
reader: new Ext.data.JsonReader({}, ['value','text']),
data:[{
value:1,text:'test1'
},{
value:2,text:'test2'
},{
value:3,text:'test3'
},{
value:4,text:'test4'
},{
value:5,text:'test5'
},{
value:6,text:'test6'
},{
value:7,text:'test7'
},{
value:8,text:'test8'
},{
value:9,text:'test9'
},{
value:10,text:'test10'
}]
})
var ms=new Ext.form.MultiSelect({
renderTo:'multiSel',
store:store,
height:150
});
Ext.get('g').on('click',function(){
alert("选中行索引:"+ms.getSelectedIndexes());
var recs=ms.getSelectedRecords();
var value="选中项的值";
Ext.each(recs,function(rec){
value+='/ntext:'+rec.get('text')+",value:"+rec.get('value')
})
alert(value);
})
});
html代码:
<div id="multiSel" style="width:200px;"></div>
<input type="button" value="getRecord" id='g' />
在网上看到有很多朋友都需要这个组件,今日无聊,于是就简单的扩展了一个,共享给大家。同时再赞ext的强大!
目前支持如下功能:
1、键盘上下箭头导航。
2、键盘上下箭头选择某项保证该项可见(自动滚动滚动条以保证显示)。
3、初始化默认选中第一条记录。
4、通过ctrl或shift实现多项选择。(这个是dataView本身支持的)
以下是通过Extend基于dataView扩展实现的multiSelect的代码:
Ext.form.MultiSelect=Ext.extend(Ext.DataView,{
multiSelect:true,
tpl: new Ext.XTemplate( //view的模板
'<tpl for=".">',
'<div class="x-combo-list-item">{text}</div>',
'</tpl>'
),
style:'cursor:pointer;overflow:auto',
cls:'x-combo-list-inner',
ctCls:'x-combo-list',
overClass:'x-view-over',
selectedClass:'x-combo-selected',
itemSelector:'div.x-combo-list-item',
initComponent:function(){
Ext.form.MultiSelect.superclass.initComponent.call(this);
},
onRender:function(){
Ext.form.MultiSelect.superclass.onRender.apply(this,arguments);
var _this=this;
this.el.dom.onselectstart=function(){return false} //防止鼠标选择
new Ext.KeyNav(this.el, {
"up" : function(e){
var selIndex=_this.getSelectedIndexes()[0]-1;
var index=selIndex>-1?selIndex:_this.store.getCount()-1;
_this.select(index);
},
"down" : function(e){
var selIndex=_this.getSelectedIndexes()[0]+1;
var index=selIndex==_this.store.getCount()?0:selIndex;
_this.select(index);
}
})
//定位选中项保证可见
this.on('selectionchange',function(t,node){ //定位选中项保证可见
if(!(node=node[0]))return;
var ct=this.el.dom,barHeight=0,diff;
var ctSt=ct.scrollTop,nodeOft=node.offsetTop;
if(ct.offsetHeight-ct.clientHeight>5){
barHeight=16;
}
var cntPos=[ctSt,ctSt+ct.offsetHeight-barHeight];
var nodePos=[nodeOft,nodeOft+node.offsetHeight];
if(nodePos[0]<cntPos[0]){
ct.scrollTop=nodeOft;
}
if((diff=nodePos[1]-cntPos[1])>0){
ct.scrollTop=ctSt+diff+2;
}
});
//选中第一行
var selectFirst=function(){
setTimeout(function() {
_this.select(0)
}, 1)
};
selectFirst();
this.store.on('load',selectFirst)
}
});
使用示例(JS):
Ext.onReady(function(){
var store=new Ext.data.Store({
proxy: new Ext.data.MemoryProxy(),
reader: new Ext.data.JsonReader({}, ['value','text']),
data:[{
value:1,text:'test1'
},{
value:2,text:'test2'
},{
value:3,text:'test3'
},{
value:4,text:'test4'
},{
value:5,text:'test5'
},{
value:6,text:'test6'
},{
value:7,text:'test7'
},{
value:8,text:'test8'
},{
value:9,text:'test9'
},{
value:10,text:'test10'
}]
})
var ms=new Ext.form.MultiSelect({
renderTo:'multiSel',
store:store,
height:150
});
Ext.get('g').on('click',function(){
alert("选中行索引:"+ms.getSelectedIndexes());
var recs=ms.getSelectedRecords();
var value="选中项的值";
Ext.each(recs,function(rec){
value+='/ntext:'+rec.get('text')+",value:"+rec.get('value')
})
alert(value);
})
});
html代码:
<div id="multiSel" style="width:200px;"></div>
<input type="button" value="getRecord" id='g' />
- 扩展DataView实现(MultiSelect)多行选择框
- JQuery MultiSelect(左右选择框)
- JQuery MultiSelect(左右选择框)
- bootstrap multiselect 多选下拉框实现代码
- bootstrap-multiselect多选下拉框的实现
- MultiSelect左右选择控件的设计与实现
- Bootstrap multiselect多选联动的实现
- gridpanel不加复选框的情况下实现多选,增加MultiSelect="true"
- jquery multiSelect 多选下拉框
- jquery multiSelect 多选下拉框代码
- Multiselect:操作多选列表框
- Jquery-multiselect 多选下拉框
- multiselect插件操作多选列表框
- Extjs之多选下拉框(MultiSelect)
- multiselect多选框实现
- 用multiselect实现下拉框下面的复选
- jquery-ui-multiselect 实现select下拉多选
- 使用bootstrap-multiselect.js实现Input多选功能
- 转帖--ExtJS 中的JSON優勢
- 延续经典PDA,“明”A1800试用感受
- Ext-API详解--core/Ext.js
- netbeans6减少内存占用技巧
- java操作文件(创建、删除、复制、剪切)
- 扩展DataView实现(MultiSelect)多行选择框
- 怎么洗掉衣服上的水粉颜料、丙烯颜料、水彩颜料、油画颜料
- 二分变量之二——二分变量预测结果的三种表达
- DNS 漏洞发现者 Dan Kaminsky 访谈录
- 董事们,小心别被社会制裁了
- 全球黑客盛会:2008年黑帽大会要闻摘要
- 整理系统调用
- java取系统时间
- 遭遇scvhost.exe,kcohj1ba.sys,4f4.exe,w509v.sys,8g4.dll,307b.dll等