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

当我们选择一级栏目中某条记录的时候,会获取该栏目的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="width: 5%">
<col style="width: 15%">
<col style="width: 15%">
<col style="width: 15%">
<col style="width: 15%">
<col style="width: 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=;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=;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());

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

php仿经典省市县三级联动的更多相关文章

  1. jQuery - 全国省市县三级联动

    最近有空用jquery做了一个全国省市县的三级联动,在以后或许可以用的到 ,遗憾的是我还没用封装,等有空看能不能封装成一个插件 废话不多说,贴上代码: <!doctype html> &l ...

  2. wex5 实战 省市县三级联动与地址薄同步

    无论是商城,还是快递,都要用到省市县三级联动,和地址薄,今天就以实战来制作,难点有3个: 1:三级联动,有wex5组件实现,相对简单,实战里对行数据进行了拼接 2:  地址薄选项,利用inputSel ...

  3. 省市县三级联动 sql语句

    发现在网上的省市县三级联动大部分是mysql的.就算是sqlserver的,也不准确.于是就把mysql的给改了下,适用sqlserver.sql语句如下: CREATE TABLE Dic_Area ...

  4. Android 省市县 三级联动(android-wheel的使用)[转]

    转载:http://blog.csdn.net/lmj623565791/article/details/23382805 今天没事跟群里面侃大山,有个哥们说道Android Wheel这个控件,以为 ...

  5. Android 省市县 三级联动(android-wheel的使用)

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/23382805 今天没事跟群里面侃大山,有个哥们说道Android Wheel这个 ...

  6. 项目总结01:JSP mysql SpringMvc下中国省市县三级联动下拉框

    JSP mysql SpringMvc下中国省市县三级联动下拉框 关键词 JSP  mysql数据库  SpringMvc  ajax   Controller层  Service层  中国地区  省 ...

  7. Day 16 之二 省市县三级联动

    摘录自:雨神,供参考! province_dic = { "河北": { "石家庄": ["鹿泉", "藁城", &qu ...

  8. android:省市县三级联动(基于json和spring)

    一.请看效果图": 二.程序的代码: 1.MainActivity.java package com.loveplusplus.loader.demo.ui; import org.json ...

  9. 省市县三级联动js代码

    省市县三级联动菜单,JS全国省市县(区)联动代码,一般可以用于用户注册或分类信息二手交易网站,需要的朋友直接复制代码就可以用了,不过有朋友反馈说缺少某些城市,具体缺少哪个尚不知,请想用的朋友自己补全吧 ...

随机推荐

  1. TCP三次握手及其背后的缺陷

    概述 总结一下TCP中3次握手过程,以及其原生的缺陷 引起的SYN Flood的介绍 [1]TCP三次握手 [2]SYN Flood 1.TCP连接建立--三次握手 几个概念: [1]seq:序号,占 ...

  2. 使用go reflect实现一套简易的rpc框架

    go jsonrpc 在实际项目中,我们经常会碰到服务之间交互的情况,如何方便的与远端服务进行交互,就是一个需要我们考虑的问题. 通常,我们可以采用restful的编程方式,各个服务提供相应的web接 ...

  3. FreeMarker 生成Java、mybatis文件

    FreeMarker 生成Java.mybatis文件 将mysql数据库表通过FreeMarker生成对应的Java文件和对应的mybatis文件. FreeMarker是一款模板引擎: 即一种基于 ...

  4. 9.3、Libgdx手势检测

    (官网:www.libgdx.cn) 触摸屏在输入的基础上增加了手势检测,比如两个手指实现缩放,单击或双击屏幕,长按屏幕等. Libgdx提供了GestureDetector来帮助你检测以下手势: t ...

  5. 使用OC和Swift两种语言写一个发射烟花的小项目

    OC与Swift两种实现方式基本上区别不大,主要是在一些对象或方法的调用方式不同,附带源码. OC代码样式: self.view.backgroundColor = [UIColor blackCol ...

  6. CSS中编写省略号代码片段

     #component-content #dtMain .dt-ul > li .component-item .component-name{ display:inline-block; ...

  7. 《java入门》第一季之类(String类字符串一旦被赋值就没法改变)

    毫无疑问,String类是java里面最重要的类之一.因此它有很多方法需要了解和掌握. 字符串一旦被赋值,值就不能发生改变: package cn.itcast_02; /* * 字符串的特点:一旦被 ...

  8. Cocos2D v2.0至v3.x简洁转换指南(一)

    在该指南开头,我们假设你应经很熟悉Cocos2d 2.x版本. 我们将指出新版本重要的改变,并且给出一些你已经从Cocos2d 2.x版本中熟知的实现. CCNodes,CCScenes和CCLaye ...

  9. HDFS读写数据过程

    一.文件的打开 1.1.客户端 HDFS打开一个文件,需要在客户端调用DistributedFileSystem.open(Path f, int bufferSize),其实现为: public F ...

  10. UML之包图

    包图是UML中用类似于文件夹的符号表示的模型元素的组合,系统中的每个元素都只能为一个包所有,一个包可嵌套在另一个包中,使用包图可将相关元素归入一个系统,一个包中包含附属包.图表或单个元素.简单的来说, ...