最近有个需求,需要点击“添加日期按钮”弹出窗口对日期进行添加并将所选日期动态添加到multiselect上并显示,此外还需实现multiselect上单个或全部清除的功能。
Ext上multiselect的官方例子都是静态数据的,网上搜了下,这方面的资料也很少,有的话也要用到json数据实现。但是我的需求中multiselect要显示的数据只是几个日期值,可以说是个一维数组而已,不想那么复杂。结合网上稀少的资料,想出了以下方案实现。
先贴以下myMultiselect.js的代码
写道
Ext.onReady(function() {
Ext.BLANK_IMAGE_URL = "<%=path%>/ext2/resources/images/default/s.gif";
Ext.QuickTips.init();
Ext.form.Field.prototype.msgTarget = 'side';
var count = 0;//日期计数器,最大值为9,即最多添加10个时段
var addDay = [];//用于放添加日期,并为multiselect提供原始数据,格式为YYYY/MM/DD
/*
**重写Array.prototype.remove,让其可以指定值删除数组元素
*/
Array.prototype.indexOf = function(val) {
for (var i = 0; i < this.length; i++) {
if (this[i] == val) return i;
}
return -1;
};
Array.prototype.remove = function(val) {
var index = this.indexOf(val);
if (index > -1) {
this.splice(index, 1);
}
};
/*
**定义添加日期monitorFeildSet
*/
var monitorFeildSet = new Ext.form.FieldSet({
title : '添加日期',
collapsible : true,
autoHeight : true,
autoWidth : true,
items:[{
deferredRender : false,
id : 'monitorPanel',
width : 500,
height : 180,
frame : true,
region : 'center',
items : [{
xtype:"multiselect",
fieldLabel:"Multiselect<br/>(Required)",
name:"multiselect",
id:"multiselect",
dataFields:["value", "text"],
valueField:"value",
displayField:"text",
width:480,
height:130,
allowBlank:false,
//data: [[1,123]], //去掉的话,原始数据为空,因为是动态的,所以这里可以不定义
tbar:[{
cls : 'x-btn-text-icon manager_delete',
text:"删除日期",
handler:function(){
if(count!=0){//记录为0不作任何操作
var record =Ext.getCmp("multiselect").store.getAt(Ext.getCmp("multiselect").view.getSelectedIndexes());
if(record==null||record==''){//没选择情况下删除的处理
alert("请选择一个日期!");
}else{
Ext.getCmp("multiselect").store.remove(record);//用remove()删除单个记录
addDay.remove(record.get('text'));//从addDay数组删除指定值
count=count-1;//日期计数器减1
}
}
}
},{
cls : 'x-btn-text-icon manager_delete',
text:"全部清除",
handler:function(){
Ext.getCmp("multiselect").store.removeAll();//用removeAll()删除所有记录
addDay = new Array();//清空addDay
count=0;//日期计数器清0
}
}]
}],
buttons : [{
cls : 'x-btn-text-icon manager_add',
text : '添加日期',
handler : function(){
var dp = new Ext.DatePicker({
id:'dp_id',
handler:function(){
if(count<=9){
var action=true;//用以判断添加日期是否重复,重复则为false
for(var i=0;i<addDay.length;i++){
if(addDay[i]==Ext.util.Format.date(Ext.getCmp("dp_id").getValue(),'Y/m/d')){
action=false;
}
}
if(action==true){//如果添加的日期不重复则执行
addDay.push(Ext.util.Format.date(Ext.getCmp("dp_id").getValue(),'Y/m/d'));//把要添加的日期放到addDay
var item = [],itemObj,record;
var dataItem =[];//一个dataItem其实就是一个multiselect的record的原始数据["value","text"],但需要把dataItem转化成object,然后再转化为一个记录record才可添加到multiselect的store里面
dataItem.push(count);//把计数器count作为multiselect的displayField
dataItem.push(Ext.util.Format.date(Ext.getCmp("dp_id").getValue(),'Y/m/d'));//把所选日期作为multiselect的valueField
var data = [dataItem];//multiselect的data形式为[["value","text"],["value","text"]...],接下来要把数据转化为object
for(var i = 0; i<data.length;i++){
item = data[i];
itemObj = new Object();
itemObj.value = item[0];//将object转化为一个记录
itemObj.text = item[1];////向store添加记录
record = new Ext.data.Record(itemObj);//将object转化为一个记录
Ext.getCmp("multiselect").store.add(record); //向store添加记录
}
Ext.getCmp("multiselect").reset();//刷新下multiselect
count = count+1;//日期计数器加1
win.close();
}else alert("不能添加相同的日期!");
}else alert("抱歉,目前只能添加不超过10个日期!");
}
});
var win = new Ext.Window({
id:"win_id",
title:"添加日期",
width:196,
height:228,
items : [{
width:196,
height:228,
items:[dp]
}]
});
win.show();
}
}]
}]
});
//定义主panel
var panel = new Ext.Panel({
id : 'panel_id',
frame : true,
autoScroll : true,
items : [{
layout : "fit",
items:[monitorFeildSet]
}],
buttons : [{
text:"保存",
handler : function(){
}
}]
});
new Ext.Viewport({
layout : "fit",
items : panel
});
});
把jsp的代码也给了吧:
写道
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title></title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<link rel="stylesheet" type="text/css" href="<%=path%>/ext2/resources/css/ext-all.css" />
<link rel="stylesheet" type="text/css" href="<%=path%>/css/desktop.css" />
<style type="text/css">
* {
font-size: 8pt;
font-family: "Tahoma";
}
</style>
<script type="text/javascript" src="<%=path%>/ext2/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="<%=path%>/ext2/ext-all.js"></script>
<!-- multiselect -->
<link rel="stylesheet" type="text/css" href="<%=path%>/js/monitor_time/multiselect.css"/>
<script type="text/javascript" src="<%=path%>/js/monitor_time/DDView.js"></script>
<script type="text/javascript" src="<%=path%>/js/monitor_time/MultiSelect.js"></script>
<script type="text/javascript" src="<%=path%>/js/monitor_time/ItemSelector.js"></script>
<script type="text/javascript" src="<%=path%>/js/monitor_time/myMultiselect.js"></script>
</head>
<body>
</body>
</html>
还有multiselect.css,MultiSelect.js,ItemSelector.js,DDView.js也给下
本例子是用Ext2做的,已运行过。
- 大小: 10.7 KB
分享到:
相关推荐
标题中的“ext,MultiSelect,动态添加”涉及的是ExtJS框架中的组件使用,特别是MultiSelect(多选下拉框)的动态操作。ExtJS是一个强大的JavaScript库,用于构建富客户端Web应用程序,它提供了丰富的组件库,包括...
然后,下载 `jquery_multiselect` 压缩包,解压后将 `jquery.multiselect.js` 和相应的 CSS 文件(如 `jquery.multiselect.css`)添加到你的项目资源目录中。在 HTML 页面中,添加 `<script>` 和 `<link>` 标签引入...
在HTML结构中,你需要为普通的`<select>`元素添加`multiple`属性和`data-toggle="multiselect"`数据属性,以便该插件能够识别并转换为多选下拉框。 2. **初始化** 在JavaScript中,你需要通过调用`$('select')....
此外,还可以使用`.multiselect('refresh')`方法更新组件的状态,比如在动态添加或删除选项后。`.multiselect('destroy')`方法则可以将Multiselect恢复为原始的`<select>`元素。 总结起来,jQuery UI Multiselect...
- `selectedTextFormat`:控制如何显示已选中的选项,可以是“count”(显示数量)、"static"(固定文本)或"dynamic"(动态生成文本)。 - `includeSelectAllOption`:是否显示全选/取消全选选项。 - `selectAll...
3. 动态更新:当用户进行选择或取消选择时,Multiselect会实时更新DOM结构,确保选中状态的一致性。 二、Multiselect的关键功能实现 1. 添加与移除:通过监听“添加”和“移除”按钮的点击事件,Multiselect实现将...
在使用Bootstrap Multiselect时,你需要在HTML中引入Bootstrap库和Bootstrap Multiselect插件的CSS和JS文件,然后在合适的`<select>`元素上添加`class="multiselect"`并进行初始化。例如: ```html <select class="...
通常用于显示大量数据,通过Adapter将数据源绑定到ListView,动态加载内容。ListView通过复用视图项(ViewHolder模式)提高性能,减少内存消耗。 2. **CheckBox**: CheckBox是Android的开关控件,用户可以选择两种...
2. **下载插件**:获取"bootstrap-multiselect.js"和"bootstrap-multiselect.css"文件,并将其放在合适的位置。 3. **HTML结构**:创建一个`<select>`元素,为其添加`multiple`属性以启用多选功能,并设置`id`以便...
插件的核心是监听用户的输入事件,对输入框的值进行处理,然后使用正则表达式匹配下拉框中的选项,动态改变选项的显示状态。同时,它利用jQuery的事件系统和DOM操作,实现与用户交互的响应式更新。 总结,"jQuery ...
在解压后,我们需要关注两个核心文件 "multiselect.min.js" 和 "multiselect.js",它们是这个插件的核心组件,实现了多选框的动态操作和样式美化。 `multiselect.js` 是未压缩的源代码文件,开发者可以在这个文件中...
- 添加预设的选中项。 - 监听并响应用户的选择变化,以便在后台进行相应的逻辑处理。 - 能够方便地与后端数据进行交互,例如动态加载选项或者保存用户的选择。 对于初学者,通过研究这个"绝对可用的Multiselect ...
6. **可定制化**:允许自定义样式和配置项,如改变选中项的标记、显示模式等。 7. **事件驱动**:提供多种事件回调,便于监听用户操作并做出响应。 8. **无障碍性**:考虑到了无障碍性(A11Y),确保屏幕阅读器和...
通过API方法,可以在程序逻辑中动态增删选中项。同时,考虑到性能和用户体验,应适当优化多选框的加载速度和交互响应。 总的来说,jQuery multiSelect插件以其强大的功能和灵活性,为开发者提供了一个高效的下拉...
2. `dropdown_hover.gif`, `dropdown.gif`, `dropdown_active.gif`:这些是动态图文件,用于在鼠标悬停和选中状态时显示下拉框的动画效果,提升了用户体验。 3. `jquery.multiSelect.html`:这是一个演示文件,包含...
回调函数将新选项添加到`<select>`元素中,并调用`refresh`方法更新Bootstrap Multiselect的状态。 总的来说,Bootstrap Multiselect 是一个强大且灵活的前端组件,它简化了在Bootstrap环境中实现多选下拉菜单的...
接着,可以从GitHub或官方资源库下载`Multiselect2Side`插件的压缩包,解压后将`multiselect2side.js`和对应的CSS文件(通常是`multiselect2side.css`)添加到项目中。在HTML文件中,通过`<script>`和`<link>`标签...
1. **初始化插件**:要使用Jquery Multiselect,首先需要在HTML中添加一个select元素,并确保引入了jQuery库以及Jquery Multiselect的CSS和JS文件。然后,通过JavaScript调用`.multiselect()`方法来初始化这个插件,...
此外,还可以通过API进行动态添加、删除选项,或者在运行时改变插件的配置。 总之,jQuery Multiselect插件提供了一个强大的多选下拉框解决方案,不仅在视觉上提高了用户体验,还在功能上满足了开发者的需求。通过...