AJAX实现省市县三级联动效果


Posted in Javascript onOctober 16, 2021

最近在学AJAX做到这个省市县三级联动的案例,这里只是讲一下ajax请求的一些知识,对服务端数据.php文件就不叙述了。
(tips:其实省市县三级联动只需要引入jQuery省市县三级联动插件就可以实现)

效果图

AJAX实现省市县三级联动效果

首先准备两个服务端文件,另一个文件太长,这里就不导入了

selsect.php

<?php 
    /*
    省市县后台数据接口
 接口调用规则:
 1.参数一:flag,用来区分请求的是省市县中间的那种数据
 2.参数二:选择省的时候传递pid,选择市的时候传递cId
 http://localhost/select.php?flag=1#pId=23
    */
    // include('./selectdata.php');
    require('./selectdata.php');
    // 省市县数据来自selectdata.php文件
    $province = $provinceJson;
    $city = $cityJson;
    $county = $countyJson;

    $flag = $_GET['flag'];
    // 省级数据
    if($flag == 1){
        echo json_encode($province);
    // 市级数据
    }else if($flag == 2){
        $pId = $_GET['pId'];
        $cityData = array();
        foreach ($city as $value) {
            if($value->id == $pId){
                // 直辖市
                array_push($cityData,$value);
                break;
            }else if($value->parent == $pId){
                // 非直辖市
                array_push($cityData,$value);
            }
        }
        echo json_encode($cityData);
    // 县级数据
    }else if($flag == 3){
        $cId = $_GET['cId'];
        $countyData = array();
        foreach ($county as $value) {
            if($value->parent == $cId){
                array_push($countyData,$value);
            }
        }
        echo json_encode($countyData);
    }
?>

select.html

这里可以用 底层ajax 请求,也可以用快捷方法 $.get 方法进行数据请求。因为请求的服务端文件跟当前文件 同源 ,所以不需要进行 跨域 请求。

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title></title>
  <script src="jquery-3.4.1.js" type="text/javascript" charset="utf-8"></script>
  <script type="text/javascript">
   $(function($){
    function queryData(obj,callback){
     // $.ajax({
     //  type:'get',
     //  url:'http://localhost/AJAX/select.php',
     //  data:obj,
     //  dataType:'json',
     //  success:function(data){
       
     //   callback(data);
     //  }
     // });
     $.get('http://localhost/AJAX/select.php',obj,function(data){
      callback(data);
     },'json');
    };
    queryData({
     flag:1
    },function(data){
     var option = '';
     $.each(data,function(i,e){
      option += '<option value="' + e.id + '">' + e.province +'</option>'
     });
     $('#province').append(option);
    });
    $('#province').change(function(){
     // 避免数据叠加
     $('#city').find('option:gt(0)').remove();
     queryData({
      flag:2,
      pId:$(this).val()
     },function(data){
      var option = '';
      $.each(data,function(i,e){
       option += '<option value="' + e.id + '">' + e.city +'</option>'
      });
      $('#city').append(option);
     });
    });
    $('#city').change(function(){
     $('#county').find('option:gt(0)').remove();
     queryData({
      flag:3,
      cId:$(this).val()
     },function(data){
      var option = '';
      $.each(data,function(i,e){
       option += '<option value="' + e.id + '">' + e.county +'</option>'
      });
      $('#county').append(option);
     });
    });
   });
  </script>
  <style type="text/css">
   #container{
    width: 500px;
    min-height: 300px;
    margin: auto;
    text-align: center;
    padding: 10px;
    
   }
  </style>
 </head>
 <body>
  <div id="container">
   <label>
    省:
    <select id="province">
     <option >请选择省...</option>
    </select>
   </label>
   <label>
    市:
    <select id="city">
     <option >请选择市...</option>
    </select>
   </label>
   <label>
    县:
    <select id="county">
     <option >请选择县...</option>
    </select>
   </label>
  </div>
 </body>
</html>

这里还需要说明的是:使用$.ajax方法请求时,如果第二次ajax请求依赖于第一次请求的结果,那么第二次请求必须放到回调函数内部,这是因为ajax 异步 请求。

类似于这样

$.ajax({
 type:'get',
 url:'citycode.php',
 data:{cityName:city},
 dataType:'json',
 // 如果第二次ajax请求依赖于第一次请求的结果,那么第二次请求必须放到回调函数内部
 success:function(data){
  $.ajax({
   type:'get',
   url:'cityweather.php',
   data:{cityCode:data.cityCode},
   dataType:'json',
   success:function(res){
   data = res.retData;
   var tag = '<ul><li>风向:'+data.WD+'</li><li>风级:'+data.WS+'</li><li>海拔:'+data.altitude+'</li><li>日期:'+data.date+'</li><li>最高温度:'+data.h_tmp+'</li><li>最低温度:'+data.l_tmp+'</li><li>平均温度:'+data.temp+'</li><li>日出时间:'+data.sunrise+'</li><li>日落时间:'+data.sunset+'</li><li>纬度:'+data.latitude+'</li><li>经度:'+data.longitude+'</li></ul>'
   $('#info').html(tag);
   }
  })
 }
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jquery的loading 加载提示效果实现代码
Sep 01 Javascript
js FLASH幻灯片字符串中有连接符&的处理方法
Mar 01 Javascript
javascript采用数组实现tab菜单切换效果
Dec 12 Javascript
同时使用n个window onload加载实例介绍
Apr 25 Javascript
JS Jquery 遍历,筛选页面元素 自动完成(实现代码)
Jul 08 Javascript
node.js中的fs.lchmod方法使用说明
Dec 16 Javascript
javascript正则表达式使用replace()替换手机号的方法
Jan 19 Javascript
AngularJS实现的根据数量与单价计算总价功能示例
Dec 26 Javascript
Vuex入门到上手教程
Jun 20 Javascript
详解React 服务端渲染方案完美的解决方案
Dec 14 Javascript
使用 Jest 和 Supertest 进行接口端点测试实例详解
Apr 25 Javascript
解决Vue的项目使用Element ui 走马灯无法实现的问题
Aug 03 Javascript
简单聊聊Vue中的计算属性和属性侦听
Oct 05 #Vue.js
JS中如何优雅的使用async await详解
Oct 05 #Javascript
js中Object.create实例用法详解
Oct 05 #Javascript
TypeScript中条件类型精读与实践记录
Oct 05 #Javascript
SSM VUE Axios详解
Ajax实现三级联动效果
Oct 05 #Javascript
5种 JavaScript 方式实现数组扁平化
Oct 05 #Javascript
You might like
PHP+JS无限级可伸缩菜单详解(简单易懂)
2007/01/02 PHP
PHP学习之输出字符串(echo,print,printf,print_r和var_dump)
2011/04/17 PHP
PHP操作文件的一些基本函数使用示例
2014/11/18 PHP
jquery ajax执行后台方法
2010/03/18 Javascript
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
jqPlot 图表中文API使用文档及源码和在线示例
2012/02/07 Javascript
js 自定义个性下拉选择框示例
2013/08/20 Javascript
JavaScript模块化开发之SeaJS
2015/12/13 Javascript
JS获取及验证开始结束日期的方法
2016/08/20 Javascript
jQuery Ajax请求后台数据并在前台接收
2016/12/10 Javascript
vue引入jq插件的实例讲解
2017/09/12 Javascript
vue组件之Alert的实现代码
2017/10/17 Javascript
Vue.js@2.6.10更新内置错误处机制Fundebug同步支持相应错误监控
2019/05/13 Javascript
解决LayUI加上form.render()下拉框和单选以及复选框不出来的问题
2019/09/27 Javascript
Windows下安装 node 的版本控制工具 nvm
2020/02/06 Javascript
[01:53]3.19 DOTA2发布会 现场精彩Coser表演
2014/03/25 DOTA
Python入门_浅谈逻辑判断与运算符
2017/05/16 Python
Python使用requests及BeautifulSoup构建爬虫实例代码
2018/01/24 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
2018/06/11 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
2018/11/14 Python
Python完成毫秒级抢淘宝大单功能
2019/06/06 Python
基于HTML5 Canvas 实现弹出框效果
2017/06/05 HTML / CSS
HTML5之SVG 2D入门12—SVG DOM及DOM操作介绍
2013/01/30 HTML / CSS
俄罗斯街头服装品牌:Black Star Wear
2017/03/01 全球购物
美国娱乐和流行文化商品店:FYE
2017/09/14 全球购物
香港卓悦化妆品官网:BONJOUR
2017/09/21 全球购物
德国2018年度最佳在线药房:Bodfeld Apotheke
2019/11/04 全球购物
如果让你测试一台高速激光打印机,你都会进行哪些测试
2012/12/04 面试题
函授自我鉴定范文
2014/02/06 职场文书
《掌声》教学反思
2014/02/23 职场文书
校园环保建议书
2014/05/14 职场文书
相亲大会策划方案
2014/06/05 职场文书
银行员工犯错检讨书
2014/09/16 职场文书
县委常委班子专题民主生活会查摆问题及整改措施
2014/09/27 职场文书
2015年推普周活动方案
2015/05/06 职场文书
python中的3种定义类方法
2021/11/27 Python