layui省市区三级联动插件

这个是一个layui省市区三级联动插件,近来使用layui后台模板框架开发后台系统,要用到省市县/区三级联动,本想从网上找个现成的轮子,然没有自己想要的需求,就自己造了个。

本插件实现省市区相应数据通过ajax动态从服务端加载数据,省市区数据结构key-value形式。

html示例:

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<meta name="renderer" content="webkit">
		<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
		<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
		<meta name="apple-mobile-web-app-status-bar-style" content="black">
		<meta name="apple-mobile-web-app-capable" content="yes">
		<meta name="format-detection" content="telephone=no">
		<link rel="stylesheet" href="./layui/css/layui.css" />
	</head>
	<body>
		<div class="layui-form">
			<div class="layui-input-inline">
				<select name="province" lay-filter="province" class="province" province_default="110000">
					<option value="">请选择省</option>
				</select>
			</div>
			<div class="layui-input-inline">
				<select name="city" lay-filter="city" city_default="110000" disabled>
					<option value="">请选择市</option>
				</select>
			</div>
			<div class="layui-input-inline">
				<select name="area" lay-filter="area" area_default="" disabled>
					<option value="">请选择县/区</option>
				</select>
			</div>
		</div>
	</body>
	<script type="text/javascript" src="./layui/layui.js"></script>
	<script type="text/javascript">
		layui.config({
			base : "./layuiarea/" //layuiarea.js的路径
		}).use([ 'layer', 'jquery', "layuiarea" ], function() {
			var layer = layui.layer, $ = layui.jquery, layuiarea = layui.layuiarea(); 
		});
	</script>
<html>

说明:

这里我们可以通过给province_default、city_default、area_default设值,来实现省市区默认选中项。

如只想显示二级联动,可将以下代码注释.

			<div class="layui-input-inline">
				<select name="area" lay-filter="area" area_default=""  disabled>
					<option value="">请选择县/区</option>
				</select>
			</div>

js示例

layui.define(["form","jquery"],function(exports){
    var form = layui.form,
        $ = layui.jquery,
        Layuiarea = function(){};

    Layuiarea.prototype.provinces = function() {
        //加载省数据
        var proHtml = '',that = this,url="https://demo.duiniya.com/test2/area.php";
        $.get(url+"?type=0&id=0", function (data) {
			
            var dataObj = eval(data);
			var province_default = $("select[name=province]").attr("province_default");
			var city_default = $("select[name=city]").attr("city_default");
			var area_default = $("select[name=area]").attr("area_default");
            $.each(dataObj,function(idx,item){
				if(province_default ==item.code){					
                     proHtml += '<option value="' + item.code + '" selected="">' + item.name + '</option>';
				}else{
					 proHtml += '<option value="' + item.code + '">' + item.name + '</option>';
				}
            });

            //初始化省数据
            $("select[name=province]").append(proHtml);
			form.render();//更新  所在容器内的全部表单状态
			//处理市默认值
			if(province_default!="" && city_default!="" ){
				$.get(url+"?type=1&id="+province_default, function (data) {
                        var ciHtml='';
                        var dataObj = eval(data);
                        $.each(dataObj,function(idx,item){
							if(city_default ==item.code){					
								 ciHtml += '<option value="' + item.code + '" selected="">' + item.name + '</option>';
							}else{
								 ciHtml += '<option value="' + item.code + '">' + item.name + '</option>';
							}                         
                        });
                        //加载市
                        $("select[name=city]").append(ciHtml).removeAttr("disabled");
                        form.render();
                });
				if(area_default!=""){
					//默认县/区
					    $.get(url+"?type=2&id="+city_default, function (data) {
                        var areaHtml='';
                        var dataObj = eval(data);
                        $.each(dataObj,function(idx,item){
							if(area_default ==item.code){					
								 areaHtml += '<option value="' + item.code + '" selected="">' + item.name + '</option>';
							}else{
								 areaHtml += '<option value="' + item.code + '">' + item.name + '</option>';
							}    
                        });
                        //加载县区
                        $("select[name=area]").append(areaHtml).removeAttr("disabled");
                        form.render();
                    });					
				}
			}
            form.on('select(province)', function (proData) {
                $("select[name=city]").html('<option value="">请选择市</option>');
                var value = proData.value;
                if (value > 0) {
                    $.get(url+"?type=1&id="+value, function (data) {
                        var ciHtml='';
                        var dataObj = eval(data);
                        $.each(dataObj,function(idx,item){
                            ciHtml += '<option value="' + item.code + '">' + item.name + '</option>';
                        });
                        //加载市
                        $("select[name=city]").append(ciHtml).removeAttr("disabled");
                        form.render();
                    });
                } else {
                    $("select[name=city]").attr("disabled", "disabled");
                }
            });

            form.on('select(city)', function (cityData) {
                $("select[name=area]").html('<option value="">请选择县/区</option>');
                var value = cityData.value;
                if (value > 0) {
                    $.get(url+"?type=2&id="+value, function (data) {
                        var areaHtml='';
                        var dataObj = eval(data);
                        $.each(dataObj,function(idx,item){
                            areaHtml += '<option value="' + item.code + '">' + item.name + '</option>';
                        });
                        //加载县区
                        $("select[name=area]").append(areaHtml).removeAttr("disabled");
                        form.render();
                    });
                } else {
                    $("select[name=area]").attr("disabled", "disabled");
                }
            });
        })
    }

    var layuiarea = new Layuiarea();
    exports("layuiarea",function(){
        layuiarea.provinces();
    });
})

php示例

<?php
$id = $_GET['id'] ?? 0;
$type = $_GET['type'] ?? 0;//
if(!$type && !$id){
    $data = [0 => [['code' => 110000, 'name' => '北京'],
        //其他省...
        ['code' => 130000, 'name' => "河北"],],
    ];
}elseif($type==1){
    //市
    $data = [ 110000 => [['code' => 110000, 'name' => "北京"]],
        130000 => [['code' => 130100, 'name' => '石家庄'], ['code' => 130400, 'name' => "邯郸"]],
        ];
}else{
    //区
    $data = [
        130100=>[['code' => 130102, 'name' => '长安区'],],
        110000=>[['code' => 110101, 'name' => '东城区'],],
        130400=>[['code' => 130402, 'name' => '邯山区'],],
    ];
}
echo json_encode($data[$id], JSON_UNESCAPED_UNICODE);

预览地址:https://demo.duiniya.com/test2/demo.html

项目地址:https://github.com/guyan0319/layuiarea

如有任何问题或建议,欢迎批评指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
layui 中实现省市区三级联动可以使用其内置的 form 模块和 select 组件。以下是一个简单的示例代码: HTML: ```html <div class="layui-form-item"> <label class="layui-form-label">省份</label> <div class="layui-input-inline"> <select name="province" lay-filter="province"> <option value="">请选择省份</option> <!-- 省份选项 --> </select> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">城市</label> <div class="layui-input-inline"> <select name="city" lay-filter="city"> <option value="">请选择城市</option> <!-- 城市选项 --> </select> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">区/县</label> <div class="layui-input-inline"> <select name="area" lay-filter="area"> <option value="">请选择区/县</option> <!-- 区/县选项 --> </select> </div> </div> ``` JavaScript: ```javascript layui.use(['form', 'layer'], function() { var form = layui.form; var layer = layui.layer; // 加载省份选项 $.get('/api/provinces', function(data) { var html = '<option value="">请选择省份</option>'; for (var i = 0; i < data.length; i++) { html += '<option value="' + data[i].id + '">' + data[i].name + '</option>'; } $('select[name="province"]').html(html); form.render(); }); // 监听省份选择 form.on('select(province)', function(data) { var provinceId = data.value; if (provinceId) { // 加载城市选项 $.get('/api/cities', { provinceId: provinceId }, function(data) { var html = '<option value="">请选择城市</option>'; for (var i = 0; i < data.length; i++) { html += '<option value="' + data[i].id + '">' + data[i].name + '</option>'; } $('select[name="city"]').html(html); form.render(); }); } else { $('select[name="city"]').html('<option value="">请选择城市</option>'); $('select[name="area"]').html('<option value="">请选择区/县</option>'); form.render(); } }); // 监听城市选择 form.on('select(city)', function(data) { var cityId = data.value; if (cityId) { // 加载区/县选项 $.get('/api/areas', { cityId: cityId }, function(data) { var html = '<option value="">请选择区/县</option>'; for (var i = 0; i < data.length; i++) { html += '<option value="' + data[i].id + '">' + data[i].name + '</option>'; } $('select[name="area"]').html(html); form.render(); }); } else { $('select[name="area"]').html('<option value="">请选择区/县</option>'); form.render(); } }); }); ``` 其中,`/api/provinces`、`/api/cities` 和 `/api/areas` 是后端接口,用于获取省份、城市和区/县的列表数据。在选择省份和城市时,需要根据选中的省份和城市去获取对应的城市和区/县列表数据。最后,使用 form.render() 方法对表单进行渲染,使其生效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值