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 相关文章推荐
脚本吧 - 幻宇工作室用到js,超强推荐expand.js
Dec 23 Javascript
Javascript 闭包引起的IE内存泄露分析
May 23 Javascript
js 去除字符串第一位逗号的方法
Jun 07 Javascript
angularJS中$apply()方法详解
Jan 07 Javascript
Javascript中函数名.length属性用法分析(对比arguments.length)
Sep 16 Javascript
jQuery拖拽通过八个点改变div大小
Nov 29 Javascript
很棒的一组js图片轮播特效
Jan 12 Javascript
D3.js中强制异步文件读取同步的几种方法
Feb 06 Javascript
Vue按需加载的具体实现
Dec 02 Javascript
Vue组件实现触底判断
Jun 26 Javascript
微信小程序和H5页面间相互跳转代码实例
Sep 19 Javascript
有关vue 开发钉钉 H5 微应用 dd.ready() 不执行问题及快速解决方案
May 09 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长字符串定义方法
2012/07/12 PHP
解析php做推送服务端实现ios消息推送
2013/07/01 PHP
php使用异或实现的加密解密实例
2013/09/04 PHP
CodeIgniter分页类pagination使用方法示例
2016/03/28 PHP
TNC vs BOOM BO3 第二场2.13
2021/03/10 DOTA
JavaScript 模仿vbs中的 DateAdd() 函数的代码
2007/08/13 Javascript
js生成随机数之random函数随机示例
2013/12/20 Javascript
javascript中的self和this用法小结
2014/02/08 Javascript
jQuery动画效果animate和scrollTop结合使用实例
2014/04/02 Javascript
AngualrJS中的Directive制作一个菜单
2016/01/26 Javascript
JS实现table表格数据排序功能(可支持动态数据+分页效果)
2016/05/26 Javascript
深入理解jQuery之事件移除
2016/06/02 Javascript
Bootstrap的class样式小结
2016/12/01 Javascript
jq给页面添加覆盖层遮罩的实例
2017/02/16 Javascript
vue 运用mock数据的示例代码
2017/11/07 Javascript
Vue组件化开发思考
2018/02/02 Javascript
Vue render渲染时间戳转时间,时间转时间戳及渲染进度条效果
2018/07/27 Javascript
详解JavaScript中分解数字的三种方法
2021/01/05 Javascript
Python contextlib模块使用示例
2015/02/18 Python
Python CSV模块使用实例
2015/04/09 Python
在Python中处理列表之reverse()方法的使用教程
2015/05/21 Python
python爬虫实战之爬取京东商城实例教程
2017/04/24 Python
PyQT实现多窗口切换
2018/04/20 Python
对python指数、幂数拟合curve_fit详解
2018/12/29 Python
python自动发邮件总结及实例说明【推荐】
2019/05/31 Python
解决Jupyter无法导入已安装的 module问题
2020/04/17 Python
简单了解Java Netty Reactor三种线程模型
2020/04/26 Python
英国领先的独立酒精饮料零售商:DrinkSupermarket
2021/01/13 全球购物
《乌鸦和狐狸》教学反思
2014/02/08 职场文书
新年联欢会主持词
2014/03/27 职场文书
建筑工程专业大学生求职信
2014/04/23 职场文书
差生评语大全
2014/05/04 职场文书
2014年银行柜员工作总结
2014/11/12 职场文书
2016年寒假社会实践活动总结
2015/10/10 职场文书
CSS filter 有什么神奇用途
2021/05/25 HTML / CSS
CSS 实现Chrome标签栏的技巧
2021/08/04 HTML / CSS