
这二周不断有人问我如何实现ajax三级联动,于是就做了个多级联动的组件(理论上来讲可实现N级联动)。后台是用php生成xml。
这里我没采用jquery插件的写法。使用面向对象写法。
源代码点击下面的下载按钮。
点此下载该组件,明河已经重构,请查看《seriesComboBoxs — jquery多级联动插件(明河作品)》
运行脚本前,请先把citys.sql运行下,向数据库导入省、市、县数据。
初始化组件
- var comboBoxs = new yijs.form.ComboBoxs({selects : ["#p","#c","#t"],
- url : 'getData.php'});
- <table width="400" border="0" cellspacing="0" cellpadding="0">
- <tr>
- <td><select class="comboBox" id="p" style="margin-right:10px;"/></td>
- <td><select class="comboBox" id="c" width="100" style="margin-right:10px;"/></td>
- <td><select class="comboBox" id="t" width="100" /></td>
- </tr>
- </table>
- selects:是个数组,对应选择框对象
- url :后台脚本路径
来看下yijs.form.ComboBoxs这个类的代码
- /**
- * 命名空间
- */
- var yijs = {};
- yijs.form = {};
- /**
- *构造函数
- * @param {Object} options
- */
- yijs.form.ComboBoxs = function(options){
- //组件的默认参数
- var defaults = {
- /**选择框对象数组*/
- selects : null,
- /**后台脚本*/
- url : null,
- type : 'post',
- dataType : 'xml'
- };
- //覆盖默认参数
- this.options = $.extend(defaults, options);
- this.selects = this.options.selects;
- this.url = this.options.url;
- //缓存,为一个对象字面量。
- this.cache = {};
- if(this.selects.length > 0){
- //加载默认数据,向第一个选择框填充数据
- this.load($(this.selects[0]),{'id' : 0});
- for(var i=0;i<this.selects.length-1;i++){
- //给除了最后一个选择框外的对象绑定change事件
- this._change(i);
- }
- }
- }
- yijs.form.ComboBoxs.prototype = {
- /**
- * 加载数据
- * @param {Object} $select 将加载完的数据生成的html填充至该对象
- * @param {Object} data 传递给后台的参数
- */
- load : function($select,data){
- var _opts = this.options;
- var _that = this;
- var _param = data;
- //有该id下的缓存,就使用缓存填充,不然使用ajax加载数据
- if(this.cache[data.id]){
- $select.html(this.cache[data.id]);
- }else{
- if(_opts.url != null){
- $.ajax({
- type: _opts.type,
- url: _opts.url,
- dataType : _opts.dataType,
- data :data ,
- beforeSend:function(){
- },
- success: function(data){
- var _html = _that._getoptions(data);
- //将html代码写入缓存
- _that.cache[_param.id] = _html;
- //填充到相应选择框
- $select.html(_html);
- },
- complete: function(){
- }
- });
- }
- }
- },
- /**
- * 给指定的选择框绑定change事件
- * @param {number} index 选择框对象数组索引值
- */
- _change : function(index){
- var _that = this;
- //绑定change事件
- $(_that.selects[index]).change(function(){
- var _val = $(this).val();
- //第index+1个选择框开始加载数据
- _that.load($(_that.selects[index+1]),{'id' : _val});
- })
- },
- /**
- * 将后台返回的xml数据转成html代码
- * @param {xml} data 后台返回的xml数据
- */
- _getoptions : function(data){
- var _arr = [];
- var $record = $(data).find("record");
- if($record.size()>0){
- //遍历xml
- $record.each(function(){
- var option = "<option value='"+$(this).find("value").text()+"'>"+$(this).find("text").text()+"</option>"; _arr.push(option);
- })
- return _arr.join('');
- }
- return '';
- }
- }
我已经加了较详细的中文注释,这里就不再说明,有问题的可以给我留言。
来看php脚本(getData.php)
- function runSQL($rsql) {
- $hostname = 'localhost'; // 数据库服务器
- $username = 'root'; // 数据库用户名
- $password = '123'; // 数据库密码
- $dbname = 'yijs'; // 数据库名
- $connect = mysql_connect($hostname,$username,$password) or die ("Error: could not connect to database");
- $db = mysql_select_db($dbname);
- mysql_query('set names gbk');
- $result = mysql_query($rsql) or die ('test');
- return $result;
- mysql_close($connect);
- }
- header("Content-type: text/xml;charset=gbk");
- if(isset($_POST['id'])){
- $where = "WHERE f_up = ".$_POST['id']." ";
- }else{
- $where = "WHERE f_up = 0 ";
- }
- $sql = "SELECT * FROM city $where";
- $result = runSQL($sql);
- $xml = "<?xml version='1.0' encoding='gbk'?>";
- $xml .= "<root>";
- $xml .="<success>1</success>";
- $xml .="<total>0</total>";
- while ($row = mysql_fetch_array($result)) {
- $xml .= "<record>";
- $xml .= "<value>".$row['id']."</value>";
- $xml .= "<text>".$row['name']."</text>";
- $xml .= "</record>";
- }
- $xml .="</root>";
- echo $xml;
请自行修改里面的数据库配置信息。
后台接受的参数为id。

貌似下载链接失效了
非常抱歉,已经修正了。感谢反馈。
下载里面是ld1.2 这个是什么东东啊 不能用啊!
?有啊,我刚试过,可以下载。是zip压缩包。我可以确定的是可以用的,数据库什么都导好了?配置都配好了?