你可以从这里下载完整的代码associate_select.rar,该组件依赖Prototype 1.4框架。
你可以自由的在任何项目中使用该组件,但必须保留js文件中的声明。如果你需要修改或发现bug,那么请您发送邮件到jimichan@gmail.com,并随信寄来修改后的代码和说明。 本说明页面未经过本人同意不得转载,但你可以链接到该文档。
多级联动包含两个类 SelectBase 和 AssociateSelect。 SelectBase表示联动的第一级,AssociateSelect表示被联动的后续多级的类。
类 SelectBase的构造函数签名为:SelectBase(sSelectId,sLoadUrl,sChangeUrl)
注(URL自动绑定的特定的参数):之所以sLoadUrl能和sChangeUrl公用一个URL是因为在使用ajax发送请求是会在url后面加上status参数。
例如,sLoadUrl为http://localhost/bar/foo.do,那么发送则为http://localhost/bar/foo.do?status=load,那么发送sChangeUrl
的时候则为http://localhost/bar/foo.do?status=change
在两种URL上都会增加如下参数,在服务器端你可以根据这些参数来产生所需的xml
方法和属性
方法: void load();//启动联动选单
void addRelation(AssociateSelect as);增加级联选单,可多次调用,调用的顺序也表示级联选单的顺序
属性: single// 让级联选单工作在单一模式下,在下面的例子中我们将详细描述该属性
对Select的标签增加了cv属性。表示当前select的哪个option处于被选中状态,处于选中状态option
的value和cv属性的值相等。
<select cv='5'>
<option value="-1>";请选择</option>
</select>
该属性在编辑页面中恢复多级联动的选单状态很有用。
示例一: 1级选单
xml为as_ex1.xml,当然在实际应用中它可以是服务器中的产生xml的URL
<form name="bar">
<select id="ex1">
<option value="-1>";请选择</option>
</select>
</form>
<script type="text/javascript">
var ex1sb = new SelectBind('ex1','as_ex1.xml');
ex1sb.load();
</script>
示例二: 多级选单
该示例中使用唯一的URL as_ex2.action 来生成xml,那么在服务器程序中将通过URL自动绑定的特定的参数来做出正确的行为。
<form name="bar">
<select id="ex2">
<option value="-1>";请选择</option>
</select>
<select id="ex3">
<option value="-1>";请选择</option>
</select>
<select id="ex4">
<option value="-1>";请选择</option>
</select>
</form>
<script type="text/javascript">
var ex1sb = new SelectBind('ex2','as_ex2.action');
ex1sb.addRelation(new AssociateSelect('ex3'));
ex1sb.addRelation(new AssociateSelect('ex4'));
ex1sb.load();
</script>
示例三: 多级选单 & 单一模式
该示例与 示例二 一样,不过多了个特殊的需求,把多级选单看作是一个整体,需要取得多级选单的最后一级的有效选择值。
single属性的值是一个Object,包含name属性和fillSelects属性。
name是个字符串,它和对应的hidden字段的Id是相等的。
fillSelects是指向一个Function。在页面加载的时候,会将传入的hidden字段的value,然后你可以像示例三中的fillSelectsImpl
那样根据你的规则来设置select的cv属性,那么就可以根据hidden的值来恢复多级选单的状态。
<form name="bar">
<select id="ex5">
<option value="-1>";请选择</option>
</select>
<select id="ex6">
<option value="-1>";请选择</option>
</select>
<input type="hidden" id="targerId"/>
</form>
<script type="text/javascript">
var ex1sb = new SelectBind('ex5','as_ex3.action');
ex1sb.addRelation(new AssociateSelect('ex5'))
ex1sb.single = {name:'targerId',fillSelects:fillSelectsImpl}
ex1sb.load();
function fillSelectsImpl(value){
if(value){
var length = value.length;
if(length<=2){
$('ex5').setAttribute('cv',value);
}else{
$('ex5').setAttribute('cv',value.substring(0,1))
$('ex6').setAttribute('cv',value)
}
}
}
</script>