八进制

少年壮志无烟抽

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  244 随笔 :: 0 文章 :: 3241 评论 :: 14 引用
示范中心项目里有一些页面要求几个下拉选择框的内容是具有关联的关系的,例如在编辑一个实验项目时,要先在一个下拉框里选择该项目所在的示范中心,这时实验室下拉框里的内容要根据用户选中的示范中心改变。为了实现这个目的,我们先后想了几种方法。

1、在用户选择示范中心时,刷新页面,并把示范中心代码加在url的后面传给action。这样的最大问题是,如果用户已经填写了一部分表单,在更改示范中心选择的时候会丢失已填写的信息。除非在刷新时把整个表单的所有域都加在url里传回,但这样做要在jsp页面里增加非常多的逻辑,因此不能使用。

2、把与示范中心关联的几个下拉框作为iframe的方式,当选择了一个示范中心时,根据所选的示范中心重新load这个iframe,这样不会影响到其他可能已经填写的域。这样做的问题是,iframe对应的页面里要重复考虑权限问题,这是不能忍受的,同时和所有使用框架技术的应用一样,有可能造成一些页面不一致的情形。

3、前面两种方式虽然都被否决了,但它们共同的好处是在用户改变对示范中心的选择时,数据是动态加载的。第三种方式是把所有数据一次读到客户端,使用javascript的方法实现关联。我在网上找到了一些js代码,但大部分都不适合动态生成数据,这也是一开始没有使用js方式的原因之一。不过最后还是找到了一个我认为不错的js,对它进行少量修改后比较漂亮的完成了任务,下面就说说具体的方法。

这个js的演示和下载地址在http://fason.nease.net/samples/select/,这里我要感谢这位fason朋友提供这么好的工具。在需要关联的页面里,例如编辑实验项目的页面,首先要引入xselect.js这个script,然后构造一个Dsy对象,使用这个对象的add方法增加关联下拉框的各个选项。还有两个数组,sel是关联下拉框的id数组,def是这些下拉框缺省的选项值数组。最后使用attachSelect函数将dsy对象和这两个数组关联起来就大功告成。对于选项是动态生成的情况,就是要动态生成这么一段javascript,如下所示:

<script language="JavaScript" src="../xselect.js"></script>
<script language="JavaScript">
<!--
var dsy = new Dsy();
var sel = ["demoCenter","lab"];
var def = ['<bean:write name="projectForm" property="demoCenterCode"/>','<bean:write name="projectForm" property="labCode"/>'];

dsy.add(
"0",[['<bean:message key="select.prompt" bundle="root"/>','']
<logic:iterate name="<%=DemoCenter.class.getName()%>" id="dc">
    ,['
<bean:write name="dc" property="name"/>','<bean:write name="dc" property="code"/>']
</logic:iterate>
]);

dsy.add(
"0_0",[['<bean:message key="select.prompt" bundle="root"/>','']]);
<logic:iterate name="<%=DemoCenter.class.getName()%>" id="dc" indexId="index">
    dsy.add('0_
<%=index.intValue()+1%>',[['<bean:message key="select.prompt" bundle="root"/>','']
    
<bean:define id="code" name="dc" property="code" type="String" />
    
<logic:iterate name="<%=Lab.class.getName()%>" id="lab">
        
<logic:equal name="lab" property="demoCenter.code" value="<%=code%>">
            ,['
<bean:write name="lab" property="name"/>','<bean:write name="lab" property="code"/>']
        
</logic:equal>
    
</logic:iterate>
    ]);
</logic:iterate>
attachSelect(dsy,sel,def);
//-->
</script>

生成的静态页面就是下面这样,页面显示后会缺省选择“北京大学数学示范中心”和“软件工程实验室”:

<script language="JavaScript" src="../xselect.js"></script>
<script language="JavaScript">
<!--
var dsy = new Dsy();
var sel = ["demoCenter","lab"];
var def = ['10000001','10000007'];

dsy.add(
"0",[['--------请选择--------','']
    ,['教育部','1000000
0']
    ,['北京大学数学示范中心','
10000001']
    ,['北京师范大学普通话示范中心','
10000002']
    ,['北京邮电大学卫星通信示范中心','
10000003']]);
dsy.add(
"0_0",[['--------请选择--------','']]);
dsy.add('0_1',[['
--------请选择--------','']
        ,['生物实验室','
10000004']
        ,['软件工程实验室','
10000007']
]);
dsy.add('0_2',[['
--------请选择--------','']
        ,['数据挖掘实验室','
10000002']
        ,['微电子实验室','
10000003']
        ,['Web服务实验室','
10000006']
]);
dsy.add('0_3',[['
--------请选择--------','']
        ,['航空航天实验室','
10000001']
        ,['湍流实验室','
10000005']
        ,['互联网实验室','
10000008']
]);
dsy.add('0_4',[['
--------请选择--------','']
]);    
attachSelect(dsy,sel,def);
//-->
</script>

不过这个js有个小问题,就是它的def数组中的每个元素只能是一个字符串,当选择框是可多选的列表框时,就不能实现多个选项的预选择(populate)。为了解决这个问题,我对xselect.js进行了少量的修改,允许def中的每个元素是一个数组。以下是修改后的xselect.js文件中的doChange()函数:

function doChange(v) {
    
var str = "0";
    
for (var i = 0; i < v; i++) { str += ("_" + Sel[i].selectedIndex); };
    
var ss = Sel[v];
    
if (oDsy.Exists(str)) {
        
with (ss) {
            length 
= 0;
            
var ar = oDsy.Items[str], xx = 0;
            
for (var i = 0; i < ar.length; i++) {
                
var ot = ar[i][0], ov = ar[i][1? ar[i][1] : ot;
                
//if (ov == Store[v]) xx = i;
                options[i] = new Option(ot, ov);

                
//Added by zhanghao
                if(Store[v] instanceof Array){
                    
for(var j=0;j<Store[v].length;j++)
                        
if(Store[v][j] == ov)options[i].selected = true;
                }
else{
                    
if(ov == Store[v])options[i].selected = true;
                }
            }
            
//options[xx].selected = true;
            if (++< Sel.length) doChange(v);
        } 
    } 
else {
        
for (var i = v; i<Sel.length; i++) {
            
with (Sel[i]) {
                length 
= 0;
                options[
0= new Option("--""");
                options[
0].selected = true;
            }
        }
    }
}

其中注释掉了两句,并增加了一段对数组元素的处理,目前这个js在示范中心系统里工作良好。为了让jsp页面中的代码进一步减少,我们今后还要把动态生成js的代码写为tag的方式。

Web页中级联下拉选择框问题是一个非常普遍的问题,本贴里介绍的是我认为十分圆满的一个客户端方式的解决方法,用户在使用时不会感到任何不便,而且因为数据权限问题是在action里已经解决的,在对应的jsp页面里所做的任何处理都不需要考虑数据权限了。但在一些数据量特别大的系统里要考虑网络连接速度是否适合将所有数据传到客户端的问题。

Update: 相关代码下载

posted on 2004-11-15 13:40 八进制 阅读(10709) 评论(83)  编辑 收藏 网摘 所属分类: Java项目(示范中心)

评论

#1楼[楼主] 2004-11-29 15:48 八进制      
我们已经把这个方法包装成了tag(虽然这个tag不是通用的),在具有同样要求的页面中应用,改动很小。
  回复  引用  查看    

#2楼 2004-12-29 11:16 hama
能不能把你的Tag帖出来
学习学习啊?

  回复  引用    

#3楼[楼主] 2005-01-04 22:13 八进制      
代码有点长,贴在这里不方便,如果确实需要请留下email吧。我前面说过,这个tag并不通用,参数是和项目有关的。
  回复  引用  查看    

#4楼 2005-01-17 13:31 happy
八进制你好,我最近也被下拉框关联的问题困扰,幸运的是我也找到了fason提供的代码,但是有个问题想请教你:如果我是用一个jsp文件来读取数据库中的内容(例如读取第一个和第二个下拉框中的数据并保存到数组),那么除了你所说的那种方法(不好意思,刚学JSP,看不大明白你的方法,惭愧),还有没有其他方法可能把jsp文件读出来的数据传给javascript代码中的变量?
  回复  引用    

#5楼[楼主] 2005-01-17 23:35 八进制      
jsp运行在服务器端,javascript运行在客户端。所以让javascript得到jsp读出的数据,我想只能是用jsp构造javascript代码,例如在jsp里写<script>var var1=<%=jspVar1%>;</script>
  回复  引用  查看    

#6楼 2005-01-18 16:39 happy
这种方法似乎可以,先试试再说,谢了先.
  回复  引用    

#7楼 2005-02-25 16:19 foreverjava
113.cxr@163.com
查了很多资料,这个是最好的!
想向您要个TAG,上面是我的邮箱!

  回复  引用    

#8楼 2005-02-26 15:11 foreverjava
经过12个小时的努力,终于实现了!
小弟愚笨,见笑,见笑···
衷心感谢八进制及fason朋友!
在此说声谢谢了!

  回复  引用    

#9楼[楼主] 2005-02-27 00:23 八进制      
foreverjava:不好意思昨天没上网,现在应该不需要这个Tag了吧?欢迎交流经验:)
  回复  引用  查看    

#10楼 2005-02-28 21:03 苍天一笑
你好,终于找到这里,资料很好,能不能给我MAIL一份你的TAG?
我的EMAIL: cangtianyx@163.com
谢谢!

  回复  引用    

可以提供给我一份吗?
angzhy@shipbuildingec.com

  回复  引用    

#12楼 2005-03-16 14:27 cg
能不能给我MAIL一份你的TAG?
我的EMAIL: erossky1314@yahoo.com.cn
谢谢!


  回复  引用    

#13楼 2005-03-25 20:03 陈勇[未注册用户]
最近为此问题深感困惑.
能不能给我MAIL一份你的TAG?
我的EMAIL: erossky1314@yahoo.com.cn
谢谢!

  回复  引用    

#14楼 2005-03-25 20:04 Tom[未注册用户]
能不能给我MAIL一份你的TAG?
我的EMAIL: tom.chen@dynax.com.cn
非常感谢!

  回复  引用    

#15楼 2005-03-28 15:15 fujin
能不能给我MAIL一份你的TAG? 还有xselect.js
email: fujincoco@yahoo.com.cn

万分感谢!


  回复  引用    

#16楼 2005-03-31 11:21 sijianzuo
email sijianzuo@sina.com谢谢
  回复  引用    

#17楼 2005-04-13 20:23 一叶孤舟
来晚了,谁还有能发一份吗?
cimage@163.com

  回复  引用    

#18楼 2005-04-20 11:31 shaw
下载地址在http://fason.nease.net/samples/select/已经没有了,,唔唔。。。
哪位好人能给我发一份吗?谢谢!shaw124@sohu.com

  回复  引用    

#19楼 2005-04-21 20:56 evillive
fason的网页已经打不开了.
那份TAG能MAIL给我一份吗?谢谢~
wudangabriel@sohu.com

  回复  引用    

#20楼 2005-04-30 13:54 friends
http://fason.nease.net/samples/select/连不上,那位朋友能给我发一份呀,谢谢
xselect.js

我的mail是hcl8717@163.com

  回复  引用    

#21楼 2005-04-30 13:58 java
http://fason.nease.net/samples/select/连不上,那位朋友能给我发一份呀,谢谢
xselect.js

我的mail是hcl8717@163.com

  回复  引用    

#22楼 2005-05-04 23:01 易达[未注册用户]
我也需要,能否给我发一个?
my0356@126.com

谢谢

  回复  引用    

#23楼 2005-05-09 21:21 winner
winner1-7@163.com
级联下拉框我用js+xml实现了,但是现在有一个相关的问题困扰我,
当我改变最后一层下拉框时,希望前面所有父级下拉框相应改变,不知道你的TAG是否解决了这个问题。

  回复  引用    

#24楼[楼主] 2005-05-09 22:25 八进制      
为什么下层菜单的改变要影响上层菜单,是你的特殊需求吗,这个tag应该没有考虑这种情况。
  回复  引用  查看    

#25楼 2005-05-21 11:44 shadow
能给我一份吗。我被这个问题困扰了一周多了。
3ks.
这是我的email:
shazhenzhong@126.com

  回复  引用    

#26楼 2005-05-25 01:34 LCL
一直都没能解决这一问题,现在还可以发吗,是不是太迟了?但是我现在急着要用。
我的邮箱是:lcling22@163.com
有劳了!

  回复  引用    

#27楼 2005-06-07 10:17 gine
能不能给我MAIL一份你的TAG? 还有xselect.js
email: jhengfei@163.com

万分感谢!

  回复  引用    

#28楼 2005-06-07 13:40 Nancy
能不能给我MAIL一份你的TAG? 还有xselect.js
Nancy3399@tom.com

感激不尽!

  回复  引用    

#29楼 2005-06-08 11:09 du[未注册用户]
能不能给我MAIL一份你的TAG? 还有xselect.js
dujun100@163.com

感激不尽!

  回复  引用    

#30楼 2005-06-10 08:27 xiaolang
最近遇上这个问题
能不能给我MAIL一份你的TAG? 还有xselect.js
skywakewolf@163.com


  回复  引用    

#31楼 2005-06-11 10:40 clark
你好,也能给我一份吗? clarkpotter@sina.com
  回复  引用    

#32楼 2005-06-11 12:08 Billowy.Sea
能不能给我传一份tag啊?
billows.sea@gmail.com
谢谢

  回复  引用    

#33楼 2005-06-13 08:06 jelli
我在找相关问题的解决方法,可以给我一份tag吗?
Jelli-lu@163.com
感激不尽

  回复  引用    

#34楼 2005-06-30 21:37 ipsec110
能不能给我传一份tag啊?
ipsec110@sina.com.cn
谢谢

  回复  引用    

那个连接没用了
能发一下xselect.js给我吗?
谢谢了!
我的邮箱是020724@smail.tongji.edu.cn

  回复  引用    

#36楼 2005-07-12 09:38 秋叶[未注册用户]
请发一份给我,我现在急需谢谢,
我的邮箱是: hqx92@163.com

  回复  引用    

#37楼 2005-07-12 10:21 tyrone[未注册用户]
那个连接没用了
能发一下xselect.js给我吗?
谢谢了!
我的邮箱是tyrone.yimin@163.com

  回复  引用    

给我一份,非常感谢。daiyu@hnedu.cn
  回复  引用    

#39楼 2005-07-15 11:18 dp[未注册用户]
那个连接没用了
能发一下xselect.js给我吗?
谢谢了!
我的邮箱是dp1975330@eyou.com

  回复  引用    

最近遇上同样的问题
能不能给我MAIL一份你的TAG? 还有xselect.js
yuangaoming@sina.com


  回复  引用    

我也要一份xselect.js
maobg@aspire-tech.com

  回复  引用    

#42楼 2005-07-23 11:20 Thomas[未注册用户]
我也要一份xselect.js
Linwx99@yahoo.com

  回复  引用    

我想要xselect.js 和你的tag标记
dzf314@163.com

  回复  引用    

#44楼 2005-07-27 11:43 william[未注册用户]
麻烦也给我一份吧,我正面对这样的问题

我的邮箱 orchishq@163.com

非常感谢!

  回复  引用    

#45楼 2005-08-01 10:36 wsy_xs[未注册用户]
也给我一份吧,拜托了。

我的邮箱:wsy_xs@sina.com.cn

  回复  引用    

#46楼 2005-08-01 13:38 lyc[未注册用户]
麻烦也给我一份吧,谢了。
我的邮箱:liyucaisx@126.com

  回复  引用    

#47楼 2005-08-05 10:23 icecock[未注册用户]
那个连接不行了,所以没法试,麻烦您给我也来一份吧,多谢了
icecock@126.com

  回复  引用    

#48楼 2005-08-15 22:16 yguozh[未注册用户]
那个连接不行了,所以没法试,麻烦您给我也来一份吧,多谢了
ygz@czbank.com

  回复  引用    

#49楼 2005-08-16 16:27 liqx[未注册用户]
麻烦您给我也来一份吧,多谢了.e_mail:liqx@vip.sina.com
  回复  引用    

#50楼 2005-08-16 19:17 yguozh[未注册用户]
烦您给我也来一份吧,多谢了.e_mail:czbank@gmail.com

  回复  引用    

#51楼 2005-08-17 09:06 yguozh[未注册用户]
js执行出错,是否该js有问题,请回复,谢谢!
行:27
字符:3
代码:0
错误:缺少对象
网址:file://C:\Documents and Settings\Administrator\桌面\新建文件夹\test.html

  回复  引用    

#52楼[楼主] 2005-08-17 10:04 八进制      
可能是调用的页面有问题,或者浏览器问题,因为我用它已经做过是可以的,前面也有朋友验证过。再仔细调试一下看看吧。
  回复  引用  查看    

找了好久,能否发我一份。谢谢啦!
csongqi@163.com

  回复  引用    

wangmingjie_2002@hotmail.com谢谢
找了好久,能否发我一份。谢谢啦!

  回复  引用    

#55楼[楼主] 2005-08-25 21:19 八进制      
相关代码已上传,请在这里下载:http://www.cnblogs.com/Files/bjzhanghao/xselect.zip">http://www.cnblogs.com/Files/bjzhanghao/xselect.zip
  回复  引用  查看    

十分感谢,刚刚喝酒回来,喝多了,有不对之处多多见谅,来信已经收到。谢谢。谢谢。
  回复  引用    

#57楼 2005-09-12 09:36 nicky[未注册用户]
多谢楼主大哥了!能否发小弟一份!哦 有链接啊 谢谢 谢谢
  回复  引用    

#58楼 2005-09-26 13:27 TANG[未注册用户]
能不能给我MAIL一份你的TAG? 还有xselect.js
longxiaotang@hotmail.com
longxiaotang1981@126.com
谢谢了

  回复  引用    

#59楼 2005-10-24 11:39 tendre[未注册用户]
你好,也能给我一份TAG和xselect.js的资料吗?
y1111yi@yahoo.com.cn 谢谢!

  回复  引用    

#60楼 2005-10-24 11:43 tendre[未注册用户]
相关代码已经下载,谢谢!!
不用发送到 y1111yi@yahoo.com.cn了!

  回复  引用    

#61楼 2005-11-07 12:05 Jamedy      
我也要,email:root@zyh123.com
  回复  引用  查看    

#62楼 2005-11-09 09:11 jess[未注册用户]
请问八进制,我还是不会用,现在公司正用这个,但我也是刚刚学,请问有没有可以运行的小例子,带数据库的。请回答,小第十分感谢。
  回复  引用    

#63楼 2005-11-09 09:17 jess[未注册用户]
请问八进制,我还是不会用,现在公司正用这个,但我也是刚刚学,请问有没有可以运行的小例子,带数据库的。请回答,小第十分感谢。
我们取出的数据是用records.add(new LabelValueBean(spf.getPlatformName(), spf.getOwnerCode()));
回到页面我不知道怎么用。小弟愚笨。

  回复  引用    

#64楼 2005-11-09 09:27 jess[未注册用户]
如果可以的话,请帮小弟,小弟十分感谢。
我的邮箱是jiajian_22@126.com

  回复  引用    

#65楼 2005-11-14 14:44 ccbcgxt[未注册用户]
如果可以的话,发一份给我,我急用。谢谢。
ccbcgxt@163.com

  回复  引用    

#66楼 2005-12-12 18:26 qiaoqi[未注册用户]
前辈:能让我学习一下吗?真的非常感谢!
油箱是:hero860@163.com

  回复  引用    

#67楼 2006-02-13 15:18 周杰[未注册用户]
能不能给我一份TAG和xselect.js啊,找了好久,终于找到这里了,急用啊!!先谢了!!
我的邮箱是:loyzhou@126.com

  回复  引用    

#68楼[楼主] 2006-02-13 16:53 八进制      
相关代码下载:http://www.cnblogs.com/Files/bjzhanghao/xselect.zip">http://www.cnblogs.com/Files/bjzhanghao/xselect.zip
  回复  引用  查看    

#69楼 2006-03-03 10:03 謝謝[未注册用户]
能不能發給我一份啊!謝謝!
sunxyren@163.com

  回复  引用    

#70楼 2006-03-08 19:31 ~雷奔云~      
不得不说一句话你这个问题可以用xmlhttp来做,让servlet 返回一组<option>参数.
至于权限的判断你可以在servlet写.

  回复  引用  查看    

#71楼[楼主] 2006-03-08 22:30 八进制      
恩,以后做这种页面的时候可以考虑xmlhttp或类似技术。
  回复  引用  查看    

#72楼 2006-04-11 17:38 freefog[未注册用户]
终于找到这里了
这颗问题困扰我好几天了,能不能给我发一分啊!
先行谢过了!
guojinhui123china@21CN.com

  回复  引用    

#73楼 2006-04-13 10:51 torsac[未注册用户]
我也要阿,请发给我吧,不胜感谢!
zheng_h@svapc.com

  回复  引用    

在网上找了好久,终于找到了,这问题已经困扰我好久了,请你也给我发一份吧,先谢谢您啦!
  回复  引用    

在网上找了好久,终于找到了,这问题已经困扰我好久了,请你也给我发一份吧,我的邮件地址是:caixinc@163.com,先谢谢您啦!
  回复  引用    

  这几天做一个提交表单,被这个问题烦了好几天了,一直没好的解决办法,能不能给我也发一份啊,我的邮箱是:hzdmcheng@163.com.谢谢大虾了.
  回复  引用    

#77楼 2006-05-10 00:26 小娜[未注册用户]
最近在做JSP。被这个下拉级连问题弄的头都晕了。可下搜索到你这个帖子。
您能给我发一份吗。太谢谢了~

我的油箱:fxn9801@163.com

  回复  引用    

#78楼 2006-07-06 16:23 ge[未注册用户]
不行啊.
  回复  引用    

正在搞级联下拉选择 头都晕了 能不能给一份? chong-000001@sohu.com 谢谢
  回复  引用    

#80楼 2007-01-08 22:14 jf[未注册用户]
在网上找了好久,终于找到了,这问题已经困扰我好久了,请你也给我发一份吧,我的邮件地址是:one.jfeng@gmail.com 先谢谢您啦!
  回复  引用    

#81楼 2007-01-08 23:32 jf[未注册用户]
急!能不能给我MAIL一份你的TAG? 还有xselect.js
谢谢您!!!
我的邮箱是:one.jfeng@gmail.com

  回复  引用    

#82楼[楼主] 2007-01-09 12:54 八进制      
如果现在要做类似应用,用AJAX解决更方便。
  回复  引用  查看    

#83楼[楼主] 2007-01-09 12:56 八进制      
to jf: http://www.cnblogs.com/Files/bjzhanghao/xselect.zip">http://www.cnblogs.com/Files/bjzhanghao/xselect.zip
  回复  引用  查看    

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 64006


相关文章:

相关链接: