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 相关文章推荐
JavaScript获取GridView中用户点击控件的行号,列号
Apr 14 Javascript
js完美的div拖拽实例代码
Jan 22 Javascript
JQuery解析HTML、JSON和XML实例详解
Mar 29 Javascript
js实现人才网站职位选择功能的方法
Aug 14 Javascript
JavaScript驾驭网页-DOM
Mar 24 Javascript
阻止表单提交按钮多次提交的完美解决方法
May 16 Javascript
javascript事件模型介绍
May 31 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
Aug 01 Javascript
vue.js在标签属性中插入变量参数的方法
Mar 06 Javascript
vue生成文件本地打开查看效果的实例
Sep 06 Javascript
js canvas实现星空连线背景特效
Nov 01 Javascript
原生JavaScript实现购物车
Jan 10 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学习 计数器实例代码
2008/06/15 PHP
PHP编码转换
2012/11/05 PHP
php基于base64解码图片与加密图片还原实例
2014/11/03 PHP
详解PHP中websocket的使用方法
2016/09/15 PHP
Yii2 批量插入、更新数据实例
2017/03/15 PHP
使用jscript实现二进制读写脚本代码
2008/06/09 Javascript
Jquery index()方法 获取相应元素索引值
2012/10/12 Javascript
js 动态修改css文件用到了cssRule
2014/08/20 Javascript
js实现分享到随页面滚动而滑动效果的方法
2015/04/10 Javascript
JavaScript检测并限制复选框选中个数的方法
2015/08/12 Javascript
使用javascript插入样式
2016/03/14 Javascript
Node.js使用gm拼装sprite图片
2017/07/04 Javascript
详解react-router4 异步加载路由两种方法
2017/09/12 Javascript
vue组件之Alert的实现代码
2017/10/17 Javascript
element ui 对话框el-dialog关闭事件详解
2018/02/26 Javascript
postman+json+springmvc测试批量添加实例
2018/03/31 Javascript
如何使用vuex实现兄弟组件通信
2018/11/02 Javascript
使用js在layui中实现上传图片压缩
2019/06/18 Javascript
js实现3D旋转相册
2020/08/02 Javascript
Python数字图像处理之霍夫线变换实现详解
2018/01/12 Python
python高效过滤出文件夹下指定文件名结尾的文件实例
2018/10/21 Python
使用python将mysql数据库的数据转换为json数据的方法
2019/07/01 Python
python3 打印输出字典中特定的某个key的方法示例
2019/07/06 Python
python实现计算器简易版
2020/12/17 Python
python函数超时自动退出的实操方法
2020/12/28 Python
html5超简单的localStorage实现记住密码的功能实现
2017/09/07 HTML / CSS
GafasWorld哥伦比亚:网上购买眼镜
2017/11/28 全球购物
6号汽车旅馆预订:Motel 6
2018/02/11 全球购物
银行实习生的自我评价
2014/01/13 职场文书
个性发展自我评价
2014/02/11 职场文书
专家推荐信范文
2015/03/26 职场文书
房屋产权证明书
2015/06/19 职场文书
幼儿园保育员随笔
2015/08/14 职场文书
pygame面向对象的飞行小鸟实现(Flappy bird)
2021/04/01 Python
JavaScript阻止事件冒泡的方法
2021/12/06 Javascript
python数字图像处理之对比度与亮度调整示例
2022/06/28 Python