zoukankan      html  css  js  c++  java
  • 在数据库有地区表的情况下实现省市区三级联动

    数据表省市区三级联动 

    在工作中,老是会遇到地址三级关联,公司(外包)给了要求是能使用插件的绝不要自己写,美其名曰:不要重复造轮子。我的想法是:你得知道轮子是怎么造的,才不去做重复性肉鸡行为。

    所以自己就写了一个。

    sql国家地址表:http://pan.baidu.com/s/1gfslGkV

    用到的东西:jquery,php,thinkphp框架和一张国家地区表

    前台模板页面 index.html

    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">

        <script src="//cdn.bootcss.com/jquery/1.12.2/jquery.min.js"></script>
        <title>登陆测试</title>
    </head>
    <body>
    <select name="sheng" id="sheng">
        <option value="请选择所在省份">请选择所在省份</option>
        <volist name="sheng" id="vo1">
            <option value="{$vo1.region_id}" id="sheng">{$vo1.region_name}</option>
        </volist>
    </select>

    <select name="city" id="city" style="display: none;">

    </select>

    <select name="xian" id="xian" style="display: none;">

    </select>

    <script>
        $(function () {
            $('#sheng').change(function () {
                //省份更改后,城市,县城的情况都要被全部更新(先清除,再添加)
                $("#city").css('display','none');
                $("#city").children().remove();     //去除原来的城市列表
                $("#xian").css('display','none');
                $("#xian").children().remove();     //去除原来的县级列表


                var value = this.value;            //获取省份value作为城市的parent_id
                var url = '__CONTROLLER__/region';
                $.ajax({                            //jquery ajax
                    type:'post',
                    url:url,
                    data:{'value':value},
                    success:function (data) {
                        var result = JSON.parse(data);
                        //为了防止直辖市情况下,change条件无法触发
                        $("#city").append("<option value='请选择所在城市'>请选择所在城市</option>");
                        for(var i = 0;i < result.length;i ++){
                            /*循环添加所有城市列表*/
                            $("#city").append("<option value='"+result[i].region_id+"'>"+result[i].region_name+"</option>");
                            $("#city").css('display','inline');
                        }
                    }
                });
            });
            /*同上*/
            $('#city').change(function () {
                //城市更改后,更新县级数据
                $("#xian").css('display','none');
                $("#xian").children().remove();


        //这里的value不要和上面的重复,否则变量提升机制会覆盖掉前面的变量值
                var valueCity = this.value;
                var urlCity = '__CONTROLLER__/region';
                $.ajax({
                    type:'post',
                    url:urlCity,
                    data:{'value':valueCity},
                    success:function (data) {
                        var result = JSON.parse(data);
                        for(var i = 0;i < result.length;i ++){
                            /*alert(result[i].region_id + ' '+result[i].region_name);*/
                            $("#xian").append("<option  value='"+result[i].region_id+"'>"+result[i].region_name+"</option>");
                            $("#xian").css('display','inline');
                        }
                    }
                })

            });
        });
    </script>
    </body>
    </html>

    后台是使用的thinkphp框架

    <?php
    namespace HomeController;
    use ThinkController;

    class RegionController extends Controller
    {
        public function index(){
            $region = M('region');
            $condition['parent_id'] = 1;
            $sheng = $region->where($condition)->select();
            $this->assign('sheng',$sheng);
            $this->display();
        }

        public function region(){
            if (IS_AJAX){
                $region = M('region');
                $condition['parent_id'] = $_POST['value'];
                $city = $region->where($condition)->select();
                echo json_encode($city);
            }
        }

    }

    这样就实现了三级联动,希望自己以后,不要成为码农,要懂得思考。

  • 相关阅读:
    nodejs学习笔记
    php操作mysql数据库
    HTML5 新特性总结
    万恶的浏览器兼容问题
    图标字体使用方法
    托管代码
    进程间通信,把字符串指针作为参数通过SendMessage传递给另一个进程,不起作用
    利用自定义消息处理函数的WPARAM或LPARAM参数传递指针
    自定义消息中如果需要定义WPARAM和LPARAM,该怎么使用和分配?
    提高VS2010运行速度的技巧+关闭拼写检查
  • 原文地址:https://www.cnblogs.com/zhouqi666/p/6178996.html
Copyright © 2011-2022 走看看