这里还是拿省市区三级联动为例。
- 首先下一个三级联动的数据表,结构如下:
TP5 三级联动实例 以及 原理、流程
字段说明:
id:地址的ID
pid:等于父级地址的 id ,用于识别该地点隶属于哪里
name: 地点名称
type:地点的级别,1是省,2是市,3是县/区
表名:tree
- 在后台把所有一级地点(省)查询出来,并循环输出到前端第一个select框中
//查询所有省
private function getProvince()
{
$province = db('tree')->where ([ 'pid'=>1])->select ();
$this->assign('province',$province);
}
前端省级select框
<select class="select" name="province" id="province" onchange="loadRegion('province',2,'city');">
<option value="0" selected>省份/直辖市</option>
{volist name="province" id="vo"}
<option value="{$vo.id}">{$vo.name}</option>
{/volist}
</select>
- 给这个下拉框绑定一个onchange事件,用以触发下面的Ajax,并把需要的参数传给Ajax
三个参数:
province : 是省级select框的ID
2:对应表中type字段,等于2的所有数据,即所有二级地点
city:市级select框的ID
同理,写下下面的市、县(区)的select下拉框:
<select class="select" name="city" id="city" onchange="loadRegion('city',3,'town');">
<option value="0">市/县</option>
</select>
<select class="select" name="town" id="town">
<option value="0">镇/区</option>
</select>
- Ajax 向后台提交父级地点的 ID ,并接收在后台查询得到的 子级地点的 id 和 name,并把得来的值循环输出到子级的select框里面
<script type="text/javascript">
function loadRegion(sel, type_id, selName) {
$("#" + selName + " option").each(function() {
$(this).remove();
});
$("<option value=0>请选择</option>").appendTo($("#" + selName));
if($("#" + sel).val() == 0) {
return;
}
$.ajax({
url: "{:url('index/Index/getRegion')}",
type: 'GET',
data: {
pid: $("#" + sel).val(),
type: type_id
},
dataType: "json",
success: function(data) {
if(data) {
$.each(data, function(idx, item) {
$("<option value=" + item.id + ">" + item.name + "</option>").appendTo($("#" + selName));
});
} else {
$("<option value='0'>请选择</option>").appendTo($("#" + selName));
}
}
});
}
</script>
后台的 getRegion 方法:
public function getRegion()
{
$map['pid']=input("pid");
$map['type']=input("type");
$list=db("tree")-> where($map)->select();
echo json_encode($list);
}