一次临时起意写的jQuery插件,可能唯一不满足你的要求的是,AJAX请求你的参数有两个,你自己看看调整下应该能用。
临时写的,也没设计过,就不要吐槽那组参数什么的了。。。
//简易级联选择器
!function ($) {
"use strict";
var LevelSelect = function (element, options) {
this.$element = element;
var DEFAULT = {
urls : [],
valueFields : [],
textFields : [],
firstValue : '',
firstText : '不限',
params : [],
oneForAll : false
};
this.settings = $.extend({}, DEFAULT, options);
};
var initOptions = function (ele, url, param, value, text) {
$.ajax({
url : url,
type : 'POST',
data : param,
success : function (data) {
if(data && data.length > 0){
for(var i in data) {
var opt = '{2}';
var item = data[i];
opt = opt.replace('{1}', item[value])
.replace('{2}', item[text]);
ele.append(opt);
}
}
}
})
};
LevelSelect.prototype.init = function () {
var _me = this;
var length = _me.$element.length;
if(length > _me.settings.urls.length
|| length > _me.settings.valueFields.length
|| length > _me.settings.textFields.length){
throw Error('Please check param : urls, valueFields and textFields.');
}
_me.$element.each(function (index, ele) {
var $ele = $(ele),
url = _me.settings.urls[index],
param = _me.settings.params[index],
value = _me.settings.valueFields[index],
text = _me.settings.textFields[index],
firstValue = _me.settings.firstValue,
firstText = _me.settings.firstText,
hasNext = (index + 1) <= length,
next = $(_me.$element.get(index + 1)),
nextAll = _me.$element.slice(index + 1);
$ele.empty().append('' + firstText +'');
if (index == 0){
var p = {};
p[param] = 0;
initOptions($ele, url, p, value, text);
}
$ele.change(function () {
nextAll.find('option:gt(0)').remove();
var selected = $(this).val();
if(selected == firstValue){
return;
}
if(hasNext){
var p = {};
p[param] = selected;
initOptions(next, url, p, value, text);
}
});
});
return _me;
};
$.fn.LevelSelect = function (options) {
var levelSelect = new LevelSelect(this, options);
return levelSelect.init();
}
}(jQuery);
//使用
$('#type1, #type2, #type3').LevelSelect({
urls : ['BookTypeList.ashx','BookTypeList.ashx','BookTypeList.ashx'],
valueFields : ['TypeId', 'TypeId', 'TypeId'],
textFields : ['TypeTitle', 'TypeTitle', 'TypeTitle'],
params : ['pId', 'pId', 'pId']
});