JSON 加载 Select 多级联动

项目中正好遇到这个问题,需要将几组东南亚国家的地址JSON数据解析到下拉列表里面去,原本以为三级联动的,看下数据发现数据格式并不是一样的,有两级的三级的还有四级的,所以我这边最高定的是四级联动,可以扩展多级联动。

JSON格式

  MY: ['http://116.62.170.10:9001/static/json/en-MY.min.json'], // 马来西亚
  PH: ['http://116.62.170.10:9001/static/json/en-PH.min.json'], // 菲律宾
  ID: ['http://116.62.170.10:9001/static/json/in-ID.min.json'], // 印度尼西亚
  TH: ['http://116.62.170.10:9001/static/json/th-TH.min.json'], // 泰国
  VN: ['http://116.62.170.10:9001/static/json/vi-VN.min.json'] // 越南

HTML

<div class='address'>
    <input id="temp" name="temp" type="hidden"  />
</div>

JavaScript

$(function(){
  LoadAjaxJsonSelect()
  
  function LoadAjaxJsonSelect () {
    var $temp= $('#temp')
    var selectids = ['select1', 'select2', 'select3', 'select4']
    for (var i = 0; i < selectids.length; i++) {
      var select = document.createElement('select')
      select.id = selectids[i]
      select.name = selectids[i]
      select.className = 'selectpicker'
      $temp.parent().append(select)
    }

    var $select1 = $('#select1')
    var $select2 = $('#select2')
    var $select3 = $('#select3')
    var $select4 = $('#select4')

    $select2.hide()
    $select3.hide()
    $select4.hide()

    $.ajax({
      url: MY,
      type: 'get',
      dataType: 'json',
      data: {},
      success: function (data) {
        console.log(data)
        var html = ['<option value="">level1</option>']
        for (var p in data) {
          html.push('<option value="' + p + '">' + p + '</option>')
        }
        // level1
        var level1str, level2str, level3str
        $select1.empty().append(html.join('')).change(function () {
          $temp.val(this.value)
          level1str = this.value
          $select4.hide()
          $select3.hide()
          $select2.show()
          var html = ['<option value="">level2</option>']
          // 数据类型处理 (每个json数据格式不同)
          if (data[level1str] instanceof Array) {
            $.each(data[level1str], function (index, value) {
              html.push('<option value="' + value + '">' + value + '</option>')
            })
          } else {
            for (var l2 in data[this.value]) {
              html.push('<option value="' + l2 + '">' + l2 + '</option>')
            }
          }
          // level2
          $select2.empty().append(html.join('')).change(function () {
            $temp.val(this.value)
            level2str = this.value
            $select4.hide()
            $select3.show()
            var html = ['<option value="">level3</option>']
            if (data[level1str][level2str] instanceof Array) {
              $.each(data[level1str][level2str], function (index, value) {
                html.push('<option value="' + value + '">' + value + '</option>')
              })
            } else {
              for (var l3 in data[level1str][level2str]) {
                html.push('<option value="' + l3 + '">' + l3 + '</option>')
              }
            }
            // level3
            $select3.empty().append(html.join('')).change(function () {
              $temp.val(this.value)
              level3str = this.value
              $select4.show()
              var html = ['<option value="">level4</option>']
              if (data[level1str][level2str][level3str] instanceof Array) {
                $.each(data[level1str][level2str][level3str], function (index, value) {
                  html.push('<option value="' + value + '">' + value + '</option>')
                })
              } else {
                for (var l4 in data[level1str][level2str][level3str]) {
                  html.push('<option value="' + l4 + '">' + l4 + '</option>')
                }
              }
              // level4
              $select4.empty().append(html.join('')).change(function () {
                $temp.val(this.value)
              })
              if ($select4.get(0).options.length <= 1) {
                $select4.hide()
                return false
              }
            })
            if ($select3.get(0).options.length <= 1) {
              $select3.hide()
              return false
            }
          })
          if ($select2.get(0).options.length <= 1) {
            $select2.hide()
            return false
          }
        })
      }
    })
  }
})

Preview

图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 layui 中,可以通过使用下拉框的 onchange 事件来实现多级联效果。具体实现步骤如下: 1. 定义省份、城市、区县的下拉框: ```html <select name="province" lay-filter="province"> <option value="">请选择省份</option> <option value="1">湖南省</option> <option value="2">广东省</option> ... </select> <select name="city" lay-filter="city"> <option value="">请选择城市</option> </select> <select name="district" lay-filter="district"> <option value="">请选择区县</option> </select> ``` 2. 在 JavaScript 中编写下拉框的 onchange 事件: ```javascript <script> layui.use(['form'], function(){ var form = layui.form; // 监听省份下拉框的选择事件 form.on('select(province)', function(data){ // 获取当前选择的省份 var provinceId = data.value; // 清空城市下拉框的选项 $("select[name='city']").html("<option value=''>请选择城市</option>"); // 清空区县下拉框的选项 $("select[name='district']").html("<option value=''>请选择区县</option>"); // 如果省份不为空,则通过 Ajax 请求获取对应的城市列表 if(provinceId != ''){ $.get("/api/city?provinceId="+provinceId,function(data){ // 循环添加城市选项 for(var i=0;i<data.length;i++){ $("select[name='city']").append("<option value='"+data[i].cityId+"'>"+data[i].cityName+"</option>"); } // 重新渲染城市下拉框 form.render('select'); }); } }); // 监听城市下拉框的选择事件 form.on('select(city)', function(data){ // 获取当前选择的城市 var cityId = data.value; // 清空区县下拉框的选项 $("select[name='district']").html("<option value=''>请选择区县</option>"); // 如果城市不为空,则通过 Ajax 请求获取对应的区县列表 if(cityId != ''){ $.get("/api/district?cityId="+cityId,function(data){ // 循环添加区县选项 for(var i=0;i<data.length;i++){ $("select[name='district']").append("<option value='"+data[i].districtId+"'>"+data[i].districtName+"</option>"); } // 重新渲染区县下拉框 form.render('select'); }); } }); }); </script> ``` 3. 在服务器端编写对应的 API 接口,用于根据省份和城市获取对应的城市和区县列表。 以上就是 layui 实现多级联的简单示例。 ### 回答2: layui是一款基于jQuery的前端UI框架,其中的select级联组件可以实现多级下拉菜单之间的关联。使用layui的select级联组件,可以通过简单的代码实现省市区三级联动或其他自定义的多级联效果。 首先,我们需要引入layui的资源文件,并初始化一个select实例。然后,设置select的外观样式和数据源。 接下来,我们需要定义各级选项的数据源。可以使用数组或JSON对象来表示。第一级的选项数据可以直接写在html中,而后续级的选项数据可以使用layui的form组件的on()方法来监听前一级的选择事件,并根据选择的值加载后续级的选项数据。 在监听事件的回调函数中,我们可以根据前一级的选择值来态生成后续级的选项数据,并使用layui的select组件的render()方法重新渲染后续级的select实例,实现多级联的效果。 例如,如果要实现省市区三级联动,可以定义一个省级的select实例,并设置省级选项数据。接着,监听省级select实例的选择事件,在回调函数中根据选择的省份态生成市级的选项数据,并使用layui的select组件的render()方法重新渲染市级的select实例。然后,再监听市级select实例的选择事件,在回调函数中态生成区级的选项数据,并重新渲染区级的select实例。 通过这样的方式,就可以实现layui的select级联的效果。 总之,layui的select级联组件可以方便地实现多级下拉菜单之间的关联,通过监听选择事件和态生成选项数据来实现联效果。使用layui的select级联组件可以提升用户体验,增强网站的交互性。 ### 回答3: Layui是一个快速构建前端界面的模块化框架,它提供了多种常用的UI组件。其中的select级联是指在一个表单中的多个下拉列表之间建立关联,选择一个下拉列表的选项会影响另一个下拉列表的选项内容。 在Layui中,实现select级联有以下几个步骤: 1. 在HTML中定义对应的下拉列表元素,给每个下拉列表元素设置一个唯一的id。 2. 在JavaScript中使用Layui的form模块,使用form.on方法监听每个下拉列表的选择事件。 3. 在监听事件中获取当前选择的选项值,并根据该值设置下一个下拉列表的选项。 下面以一个三级联动为例进行说明: HTML代码: ```html <select id="province"> <option value="">请选择省份</option> <option value="广东省">广东省</option> <option value="江苏省">江苏省</option> </select> <select id="city"> <option value="">请选择城市</option> </select> <select id="district"> <option value="">请选择区县</option> </select> ``` JavaScript代码: ```javascript layui.use('form', function () { var form = layui.form; // 监听省份下拉列表的选择事件 form.on('select(province)', function (data) { var province = data.value; if (province === '广东省') { // 态设置城市下拉列表的选项 $('#city').html('<option value="广州市">广州市</option><option value="深圳市">深圳市</option>'); } else if (province === '江苏省') { // 态设置城市下拉列表的选项 $('#city').html('<option value="南京市">南京市</option><option value="苏州市">苏州市</option>'); } else { // 清空城市下拉列表的选项 $('#city').html('<option value="">请选择城市</option>'); } // 清空区县下拉列表的选项 $('#district').html('<option value="">请选择区县</option>'); // 重新渲染下拉列表 form.render('select'); }); // 监听城市下拉列表的选择事件 form.on('select(city)', function (data) { var city = data.value; if (city === '广州市') { // 态设置区县下拉列表的选项 $('#district').html('<option value="天河区">天河区</option><option value="海珠区">海珠区</option>'); } else if (city === '深圳市') { // 态设置区县下拉列表的选项 $('#district').html('<option value="福田区">福田区</option><option value="罗湖区">罗湖区</option>'); } else if (city === '南京市') { // 态设置区县下拉列表的选项 $('#district').html('<option value="玄武区">玄武区</option><option value="鼓楼区">鼓楼区</option>'); } else if (city === '苏州市') { // 态设置区县下拉列表的选项 $('#district').html('<option value="姑苏区">姑苏区</option><option value="吴中区">吴中区</option>'); } else { // 清空区县下拉列表的选项 $('#district').html('<option value="">请选择区县</option>'); } // 重新渲染下拉列表 form.render('select'); }); }); ``` 以上代码实现了一个三级联动的效果,根据选择的省份和城市态改变区县下拉列表的选项内容。在监听选择事件时,根据选择的选项值设置下一个下拉列表的选项,并通过form.render('select')重新渲染下拉列表,使其生效。 注意,在使用Layui的select级联前,需要先引入Layui的相关资源文件,如layui.js和layui.css。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值