zoukankan      html  css  js  c++  java
  • php仿经典省市县三级联动

    之前有个需求要写个类似省市县三级联动的页面,于是,网上找了点资料看了下,其实原理很简单:

    当我们选择一级栏目中某条记录的时候,会获取该栏目的vaule值,并发起ajax请求,后台根据这个vaule值,返回对应的二级数据,并且将数据填充到二级栏目列表;

    当我们选择二级栏目中某条记录的时候,会获取该栏目的vaule值,再次发起ajax请求,后台根据这个vaule值,返回对应的三级数据,并且将数据填充到三级列表。

    多说无益,请看效果:

    下面贴上这个页面的html代码(这个$data数据来源会在后面说明):

        <div class="panel-body">
            <h3>查看详细栏目</h3>
                <div class="signForm">
                    <label>一级分类名称:</label>
                    <div class="input-group short-row">
                        <select class="form-control parent"  id="fClass">
                            <option value="">请选择一级分类名称</option>
                            <?php foreach ($data as $value): ?>
                                <option
                                        value="<?= $value['fname'] ?>" ><?= $value['fname'] ?></option>
                            <?php endforeach; ?>
                        </select>
                    </div>
                </div>
                <div class="signForm">
                    <label>二级分类名称:</label>
                    <div class="input-group short-row">
                        <select class="form-control parent"  id="sClass">
                            <option value="">请选择二级分类名称</option>
    
                        </select>
                    </div>
                </div>
                <div class="signForm">
                    <table class="table table-bordered bg-white">
                        <thead>
                        <tr>
                            <th class="text-center">ID</th>
                            <th>标题</th>
                            <th>详细图片</th>
                            <!--<th>描述</th>-->
                            <th>操作</th>
                        </tr>
                        </thead>
                        <col style=" 5%">
                        <col style=" 15%">
                        <col style=" 15%">
                        <col style=" 15%">
                        <col style=" 15%">
                        <col style=" 15%">
                        <tbody id = "list">
    
                        </tbody>
                    </table>
                </div>
        </div>

    接下来是js代码:

    <script>
        $("#fClass").change(
            function() {
                getSclass();
            }
        );
        $("#sClass").change(
            function() {
                getList();
            }
        );
        function getSclass() {
            //获取选定的一级分类名称
            var fVal = $("#fClass").val();
            //根据一级分类查二级数据
            $.ajax({
                //取消异步,也就是必须完成上面才能走下面
                async:false,
                url:"http://localhost/yii2/web/index.php/mch/book/zhong/findsname",
                data:{val:fVal},
                type:"get",
                dataType:"JSON",
                success: function(data){
                    var str="<option value="">请选择二级分类名称</option>";
                    //遍历数组,把它放入str
                    for(var i=0;i<data.length;i++){
                        var content = data[i];
                        str+="<option value=""+content.sname+"">"+content.sname +"</option>";
                    }
                    $("#sClass").html(str);
                }
            });
        }
        function getList() {
            //获取选定的一级分类名称
            var sVal = $("#sClass").val();
            //根据一级分类查二级数据
            $.ajax({
                //取消异步,也就是必须完成上面才能走下面
                async:false,
                url:"http://localhost/yii2/web/index.php/mch/book/zhong/findtclass",
                data:{val:sVal},
                type:"get",
                dataType:"JSON",
                success: function(data){
                    var str="";//遍历数组,把它放入str
                    for(var i=0;i<data.length;i++){
                        var res = data[i];
                        str+="<tr> <td>"+res.id+"</td><td>"+res.tname+"</td><td> <img src='"+res.tpic+"'/></td>"+"<td></td></tr>";
                    }
                    $("#list").html(str);
                }
            });
        }
    </script>

    然后就是上面涉及到的两个接口,不难看出这两个action都是ZhongController.php类里面的方法:

    public function actionFindsname($val)
        {
            $conn = Yii::$app->db;
            $sql = "select * from sclass where fname ='".$val."'";
            $command =$conn->createCommand($sql);
            $data = $command->queryAll();
            return  $res=json_encode($data);
        }
        public function actionFindtclass($val)
        {
            $conn = Yii::$app->db;
            $sql = "select * from tclass where sname ='".$val."'";
            $command =$conn->createCommand($sql);
            $data = $command->queryAll();
            return  $res=json_encode($data);
        }

    补充说明:

    $data:这个页面(index.php)是由控制器里面的actionIndex跳过来的,那么$data自然是来自actionIndex这方法;

    public function actionIndex()
        {
            $conn = Yii::$app->db;
            $sql = "select * from fclass";
            $command =$conn->createCommand($sql);
            $data = $command->queryAll();
            return $this->render('index', ['data'=>$data,]);
        }

    这就是一级栏目数据的来源了,换种说法就是,页面的初始化数据,一级栏目数据在页面(index.php)初始化的时候就是必须有的。

    然后,当这个一级栏目数据发生改变的时候,会触发这个select标签的change事件,于是就会执行相应的回调函数(getSclass());

    相应地,当二级栏目数据发生改变的时候,会触发二级栏目select标签的change事件,于是就会执行相应的回调函数(getList());

    这样一来,三级栏目数据就会显示出来了。

  • 相关阅读:
    java 微信公众服务平台 下发 模板消息
    java web实现 忘记密码(找回密码)功能及代码
    DES加密后get获取url参数无法解密问题
    java实现url转码、解码
    java 实现 DES加密 解密算法
    oracle sqlplus 导出csv文件
    oracle导出多CSV文件的靠谱的
    Oracle 释放过度使用的Undo表空间
    Archiving not possible: No primary destinations errors
    Linux 之 shell 比较运算符
  • 原文地址:https://www.cnblogs.com/eco-just/p/8945423.html
Copyright © 2011-2022 走看看