最近一直在玩Ext,所以可能以后的东西会关于Ext的比较多。
刚开始的时候,觉得Ext真是相当的神奇,功能十分的强大。没想到新鲜感还没持续多久,问题就随之而来了。最近想要实现这么一个功能控件,就是类似ComboBox和DateField一样,可以点后面的箭头弹出一个小窗口里面设置一些信息,只不过要在弹出的一个小界面中可以放置文本框和ComboBox等许多的控件。
于是乎,想当然的找到Ext.form.ComboBox的源代码,按着我的要求改写,基本的思路就是把Ext.form.ComboBox中的list(DateView的实例)换成一个内嵌的panel,在panel里面显示需要显示的文本、checkbox等等的控件。经过一个上午的功夫,终于能够显示出界面来了,但是却碰到一个巨大的问题,只要一点击panel里面的控件,这个弹出的panel马上就自动隐藏了。再仔细Ext.form.ComboBox看看代码,里面确实强调了对控件的焦点的控制,是不能实现在弹出的panel里面再设置焦点的。
于是剩下最后的希望,即DateField了。先仔细的看了一下他的实现,这回用了个叫做Ext.menu.DateMenu的东西,而且居然是Ext.menu.Menu的子类。而在实际的操作上,一旦我们点击menu上的元素,menu是不会隐藏的,这个正适合我的要求。于是先构建我需要的panel(先在panel里放置了一个TextBox和CheckBox),然后再将其通过Ext.menu.Adapter包装成一个menu Item,再包装成一个menu,显示出来一看,居然还真就能编辑数据了。
但是接着又发现了一个问题,就是在panel中的控件一不注意就失去了焦点,没法输入了。仔细多试验了几下,发现在鼠标移动的时候,输入的焦点就自动跑开了,于是Ext.menu.Menu的源代码里面发现,其在onMouseOver函数中要根据当前的位置设置选中的MenuItem,这当然就要转移焦点了,于是简单的将生成的menu的实例的onMouseOver设置成Ext.emptyFn。再一实验就ok了。
接着我又换了一个comboBox的控件,这下又出问题了。一点Panel里面的ComboBox空间的下拉按钮,弹不出列表选择框了。刚开始我还以为是数据出问题了,换了N中写法那个列表还是不出来。突然脑子一闪,心想是不是comboBox的list的z-index属性值比menu的小导致的呢?于是加长了comboBox的列表的数据,终于在panel之外露出了list的尾巴。我晕,只有把list的z-index加大了。还好comboBox提供了listClass配置项用于自定义class,于是写了个只有z-index属性的class,放进去,居然这下就能显示出来了。接着试,居然还有问题,一选中comboBox的数据项的时候,居然外面这个panel自己先隐藏了,这下又没法编辑数据了。看来Ext的作者也没预想到我会又这么变态的做法吧。又研究了半天,最终通过调试的时候发现在点击comboBox中的list数据的时候,会触发Ext.menu.MenuMgr中的一个onMouseDown,这里面判断如果点的不是当前显示的menu的内容,就把当前menu隐藏掉。原来Ext中,应用程序只能有一个当前的活动的menu的,这个是通过Ext.menu.MenuMgr来管理活动的menu的实例的。在Ext.menu.MenuMgr中注册了一个对document的mousedown事件的监视,handler就是onMouseDown方法。于是乎首先想到的还是hook方法,就是想办法把阻碍我们办事的方法改成我们需要的样子,整了半天,发现效果也不尽如意,差点就要放弃了。
又细看了一下onMouseDown方法的实现,其实现如下:
function onMouseDown(e){
if(lastShow.getElapsed() > 50 && active.length > 0 && !e.getTarget(".x-menu")){
hideAll();
}
}
后面的e.getTarget(".x-menu")就是一个为了发现当前的事件的触发元素的父元素及祖先元素是不是包含了有x-menu这个class的,如果有就跳过不处理,否则就隐藏menu。那我们是不是把combox的listClass里加上x-menu这个class就ok了呢?一试之后,居然还真就好使了,惊叹有些复杂的东西还是有简单的解决的。
后记:这一天的琢磨,个人觉得Ext应该说还是不是足够成熟。既然提供了Ext.menu.Adapter这种包装类,但是却不能支持在menu里面放置comboBox,这也该是传说中的Bug吧。下面是示例的代码,供有缘的同志参考:
actions.template.DataTypeSettingControl = Ext.extend(Ext.form.TriggerField,{
onTriggerClick : function(){
if(this.disabled){return;}
if(!this.menu ){
this.menu = new Ext.menu.Menu({});
this.menu.onMouseOver=Ext.emptyFn;
var panel = this;
this.viewPanel = new Ext.Panel({
layout:"form",
border:false,
width:width,
height:height,
items:[new Ext.form.ComboBox({listClass:"toppest_list x-menu",
store:['yyyy','MM'],fieldLabel:'日期格式'})],
buttons:[{text:"确定",handler:function(){
value ="";
for(var i =0; i<panel.viewPanel.items.getCount();i++){
value +="," + panel.viewPanel.items.get(i).getValue();
}
panel.setValue(value);
panel.menu.destroy();
delete panel.menu;
}},{text:"取消",handler:function(){
panel.menu.destroy();
delete panel.menu;
}}]
});
this.viewPanel.on("render", function(viewPanel){
viewPanel.getEl().swallowEvent("click");
viewPanel.container.addClass("x-menu-date-item");
});
var di = new Ext.menu.Adapter(this.viewPanel,{});
this.menu.add(di);
this.menu.relayEvents(di, ["select"]);
}
this.menu.show(this.el, "tl-bl?");
}
}
其中toppest_list的定义如下:
.toppest_list{
z-index: 1000000;
}
刚开始的时候,觉得Ext真是相当的神奇,功能十分的强大。没想到新鲜感还没持续多久,问题就随之而来了。最近想要实现这么一个功能控件,就是类似ComboBox和DateField一样,可以点后面的箭头弹出一个小窗口里面设置一些信息,只不过要在弹出的一个小界面中可以放置文本框和ComboBox等许多的控件。
于是乎,想当然的找到Ext.form.ComboBox的源代码,按着我的要求改写,基本的思路就是把Ext.form.ComboBox中的list(DateView的实例)换成一个内嵌的panel,在panel里面显示需要显示的文本、checkbox等等的控件。经过一个上午的功夫,终于能够显示出界面来了,但是却碰到一个巨大的问题,只要一点击panel里面的控件,这个弹出的panel马上就自动隐藏了。再仔细Ext.form.ComboBox看看代码,里面确实强调了对控件的焦点的控制,是不能实现在弹出的panel里面再设置焦点的。
于是剩下最后的希望,即DateField了。先仔细的看了一下他的实现,这回用了个叫做Ext.menu.DateMenu的东西,而且居然是Ext.menu.Menu的子类。而在实际的操作上,一旦我们点击menu上的元素,menu是不会隐藏的,这个正适合我的要求。于是先构建我需要的panel(先在panel里放置了一个TextBox和CheckBox),然后再将其通过Ext.menu.Adapter包装成一个menu Item,再包装成一个menu,显示出来一看,居然还真就能编辑数据了。
但是接着又发现了一个问题,就是在panel中的控件一不注意就失去了焦点,没法输入了。仔细多试验了几下,发现在鼠标移动的时候,输入的焦点就自动跑开了,于是Ext.menu.Menu的源代码里面发现,其在onMouseOver函数中要根据当前的位置设置选中的MenuItem,这当然就要转移焦点了,于是简单的将生成的menu的实例的onMouseOver设置成Ext.emptyFn。再一实验就ok了。
接着我又换了一个comboBox的控件,这下又出问题了。一点Panel里面的ComboBox空间的下拉按钮,弹不出列表选择框了。刚开始我还以为是数据出问题了,换了N中写法那个列表还是不出来。突然脑子一闪,心想是不是comboBox的list的z-index属性值比menu的小导致的呢?于是加长了comboBox的列表的数据,终于在panel之外露出了list的尾巴。我晕,只有把list的z-index加大了。还好comboBox提供了listClass配置项用于自定义class,于是写了个只有z-index属性的class,放进去,居然这下就能显示出来了。接着试,居然还有问题,一选中comboBox的数据项的时候,居然外面这个panel自己先隐藏了,这下又没法编辑数据了。看来Ext的作者也没预想到我会又这么变态的做法吧。又研究了半天,最终通过调试的时候发现在点击comboBox中的list数据的时候,会触发Ext.menu.MenuMgr中的一个onMouseDown,这里面判断如果点的不是当前显示的menu的内容,就把当前menu隐藏掉。原来Ext中,应用程序只能有一个当前的活动的menu的,这个是通过Ext.menu.MenuMgr来管理活动的menu的实例的。在Ext.menu.MenuMgr中注册了一个对document的mousedown事件的监视,handler就是onMouseDown方法。于是乎首先想到的还是hook方法,就是想办法把阻碍我们办事的方法改成我们需要的样子,整了半天,发现效果也不尽如意,差点就要放弃了。
又细看了一下onMouseDown方法的实现,其实现如下:
function onMouseDown(e){
if(lastShow.getElapsed() > 50 && active.length > 0 && !e.getTarget(".x-menu")){
hideAll();
}
}
后面的e.getTarget(".x-menu")就是一个为了发现当前的事件的触发元素的父元素及祖先元素是不是包含了有x-menu这个class的,如果有就跳过不处理,否则就隐藏menu。那我们是不是把combox的listClass里加上x-menu这个class就ok了呢?一试之后,居然还真就好使了,惊叹有些复杂的东西还是有简单的解决的。
后记:这一天的琢磨,个人觉得Ext应该说还是不是足够成熟。既然提供了Ext.menu.Adapter这种包装类,但是却不能支持在menu里面放置comboBox,这也该是传说中的Bug吧。下面是示例的代码,供有缘的同志参考:
actions.template.DataTypeSettingControl = Ext.extend(Ext.form.TriggerField,{
onTriggerClick : function(){
if(this.disabled){return;}
if(!this.menu ){
this.menu = new Ext.menu.Menu({});
this.menu.onMouseOver=Ext.emptyFn;
var panel = this;
this.viewPanel = new Ext.Panel({
layout:"form",
border:false,
width:width,
height:height,
items:[new Ext.form.ComboBox({listClass:"toppest_list x-menu",
store:['yyyy','MM'],fieldLabel:'日期格式'})],
buttons:[{text:"确定",handler:function(){
value ="";
for(var i =0; i<panel.viewPanel.items.getCount();i++){
value +="," + panel.viewPanel.items.get(i).getValue();
}
panel.setValue(value);
panel.menu.destroy();
delete panel.menu;
}},{text:"取消",handler:function(){
panel.menu.destroy();
delete panel.menu;
}}]
});
this.viewPanel.on("render", function(viewPanel){
viewPanel.getEl().swallowEvent("click");
viewPanel.container.addClass("x-menu-date-item");
});
var di = new Ext.menu.Adapter(this.viewPanel,{});
this.menu.add(di);
this.menu.relayEvents(di, ["select"]);
}
this.menu.show(this.el, "tl-bl?");
}
}
其中toppest_list的定义如下:
.toppest_list{
z-index: 1000000;
}
发表评论
-
tabpanel的激活模式
2011-04-13 00:58 932listeners : { render : func ... -
ExtJs非Iframe框架加载页面实现
2011-04-09 00:32 3911在用Ext开发App应用时,一般的框架都是左边为菜单栏,中 ... -
EXTJS FORM textField emptyText 空值提交的解决办法
2011-04-02 01:10 4832Ext的textField有一个emptyText属性用起来很 ... -
项目开发中遇到的extjs常见问题
2011-03-31 22:16 1931事件触发机制 l ... -
回发或回调参数无效。在配置中使用 enableEventValidation=true或在页面中使用 启用了事件验证。
2011-03-28 23:35 1271回发或回调参数无效。在配置中使用 <pages enab ... -
extjs 如何自动缩放
2011-03-24 00:03 1582例如 可编辑的grid面板 var grid_mate ... -
Extjs 开发使用
2011-03-13 16:24 1956extjs基础 extjs基础 extjs ... -
Extjs ajax实现文本框(TextField)联想功能
2011-03-13 16:19 2346<%@ page language="ja ... -
Extjs EditorGrid 可编辑表格控件
2011-03-03 23:26 1885定义Ext.grid.ColumnModel时,列的信息项ed ... -
Extjs操作Dom
2011-02-25 23:12 12951.获取dom 通过id获取: var el = Ext. ... -
调试ExtJs利器 - Firebug(Firefox插件)
2011-02-25 00:22 1123Firebug是一个Firefox插件,集HTML查看和编辑、 ... -
调试ExtJs利器 - Full Source(IE插件)
2011-02-25 00:19 1007Full Source是一个Internet Explorer ... -
ExtJs的智能提示插件-Spket(Eclipse)
2011-02-25 00:17 841ExtJs的智能提示插件-Spket(Eclipse) -
ExtJs的智能提示插件-Spket(Eclipse)
2011-02-25 00:16 1519选择Help -> Software Updates - ... -
EXTJS accordion layout event
2011-02-24 20:14 1259EXTJS 的 accordion layout 布局在API ... -
extjs 相关PPT
2011-02-24 20:13 1030布局介绍和开发相关介绍 -
EXTJS学习系列提高篇:第七篇(转载)作者殷良胜,制作树形菜单之一
2011-02-23 00:01 1051制作树形菜单的原理是:首先连接数据库,将数据按照树的结构形式返 ... -
去掉修改后extjs中grid 左上角的红三角
2011-02-17 13:54 1465gridpanel.on('afteredit',functi ... -
可输入可联想的下拉列表的实现——Ext ComboBox
2011-02-17 13:36 1890网上这样的控件不少,有很多实现方法,其中不少的很巧妙。 ... -
extjs更换皮肤
2011-02-12 13:53 2037<head runat="server&quo ...
相关推荐
用EXT来实现下拉框ComboBox 下拉框可以实现分页
首先,ComboBox在Ext JS中是一个可选列表的输入控件,它可以展示一个下拉菜单供用户选择。在本地模式下,ComboBox的数据通常存储在本地,如JavaScript数组中,而不是从远程服务器获取。这样可以提高应用的响应速度,...
在本文中,我们将深入探讨如何使用Ext 2.0的ComboBox组件实现省份和城市联动选择框的功能。Ext是一个强大的JavaScript库,它提供了丰富的用户界面组件,包括ComboBox,用于创建下拉选择框。在这个例程中,我们将看到...
ext,ext combobox,ext二级联动,ext combobox二级联动 ___本人的原则:上传好东西,但绝不便宜.因为自己的心血 ext combobox二级联动,ext ,ext combobox,combobox,combobox二级联动,ext 二级联动 groupCombo.on('...
总的来说,这个定制的Ext ComboBox组件结合了多选和搜索功能,提高了用户在大量选项中的交互效率。理解并实现这样的功能对于开发复杂的Web应用程序是非常有价值的,尤其是在需要用户快速准确选择多项的场景下。通过...
10. **教程和示例**:描述中提到了博客链接,这可能是介绍ComboboxGrid使用方法的一个资源。访问这个链接可以获取更多关于如何使用和实现ComboboxGrid的实例和指导。 综上所述,"Ext ComboboxGrid"是一个实用的组件...
EXT2_combobox_form.rar_combobox ext_ext 这个标题暗示我们关注的是一个与EXT2相关的项目,其中包含了关于form表单和combobox的示例。EXT是一个流行的JavaScript库,主要用于构建富客户端应用,特别是Web应用的用户...
总结来说,Ext IconCombobox是Ext JS中的一个实用组件,它结合了Combobox的便利性和图标的可视化效果。通过自定义模板和数据源,我们可以轻松创建出具有图标展示的下拉列表,提高用户界面的易用性与美观度。在实际...
Ext 2.0的Combobox组件主要包含以下几个关键属性和方法: 1. **store**:这是Combobox的数据源,通常是一个Ext.data.Store对象,用于存储省份和城市的数据。数据可以是XML、JSON或其他格式,通过配置reader进行解析...
Ext中的Combobox下来框在EditGrid中的应用。Combobox显示值问题得以解决。
该资源是war包,里面包括ComboBox中的各个参数, 详细讲解在我的文档中有
在Ext JS的comboBox中,远程模式(remote mode)是一种数据加载策略,它适用于处理大量数据或实时数据的情况。在这种模式下,comboBox不会一次性加载所有选项,而是根据用户输入的关键词动态地向服务器发送请求,...
在ExtJS中,ComboBox是一个基本的输入组件,它结合了文本输入框和下拉列表的功能。默认情况下,ComboBox只允许用户选择一个选项。但是,通过扩展和定制,我们可以将其转变为支持多选的下拉框。这种组件在需要用户从...
标题中的“Ext2.0本地模式动态修改combobox选择项”指的是使用Ext JS 2.0框架中的Combobox组件在本地数据模式下实现动态更新选择项的功能。Ext JS是一个流行的JavaScript库,主要用于构建富客户端Web应用程序。...
以下是 VB2008 中 ListBox 和 ComboBox 控件的使用方法。 向 ListBox 添加项 要向 ListBox 添加项,可以使用 Add 方法。例如: ```vb With Me.ListBox1.Items .Add("red") .Add("blue") .Add("green") .Add(...
代码如下: var p_years = new Ext.form.ComboBox( { fieldLabel : ‘统计年份’, anchor : anchor_w, mode : ‘remote’, maxHeight:100, triggerAction : ‘all’, selectOnFocus : true, forceSelection : true, ...
本示例探讨如何利用Ext JS中的`Ext.form.field.ComboBox`组件,结合Java后端和JSON数据格式,来创建这样一个功能。 `Ext.form.field.ComboBox`是Ext JS框架中一个强大的组件,它提供了下拉列表的功能,可以用于创建...
WinForm中comboBox控件数据绑定的实现方法 WinForm中comboBox控件数据绑定是许多开发者需要掌握的技巧,本文将详细介绍WinForm中comboBox控件数据绑定的实现方法,并结合实例形式分析了WinForm实现comboBox控件数据...
首先在窗体中添加一个comboBox1和一个imageList(本例中带有三个图片) this.comboBox1.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;