草庐IT

哇塞 我初学javascript第1天就会使用原生数组+JSON+DOM实现了国家--城市--区县三级联动数据切换效果

极客小俊 2023-03-28 原文

✍️作者:极客小俊
?公众号同名: 一个把逻辑思维转变为代码的技术博主

javascript 三级联动数据切换效果.png

我们今天来使用纯javascript来实现一个简易的三级联动效果,不使用任何框架以及插件!???

Javascript + JSON + 数组实现三级联动 ?

准备数据 ?

这里我们就用测试JSON数据即可, 数据内容你可以随意!
如下

var data=[
 {"name":'中国',"val":"ch","city":
     [
         {"name":"重庆市","val":"cqs","area":[
                 {"name":"渝中区"},
                 {"name":"江北区"}
             ]
         },
         {"name":"深圳市","val":"szs","area":[
                 {"name":"浦东"},
                 {"name":"浦西"}
             ]
         }
     ]
 },

 {"name":'美国',"val":"ag","city":
     [
         {"name":"纽约","val":"newyork","area":[
                 {"name":"皇后区"},
                 {"name":"时代广场"}
             ]
         },
         {"name":"华盛顿","val":"hsd","area":[
                 {"name":"白宫"},
                 {"name":"神盾局"}
             ]
         }
     ]
 }

];

HTML代码结构?

国家:<select id="pro">
<option value="">请选择省份</option>
</select>
城市: <select id="city">
<option value="">请选择市</option>
</select>
地区: <select id="area">
<option value="">请选择区</option>
</select>

javascript代码逻辑 ?️


        var _pro=document.getElementById("pro");
        var _city=document.getElementById("city");
        var _area=document.getElementById("area");

        for(var i=0;i<data.length;i++){
            var _op=document.createElement("option");
            _op.value=data[i].val;
            _op.innerHTML=data[i].name;
            _pro.appendChild(_op);
        };


        _pro.onchange=function(){
            _city.innerHTML="";
            _area.innerHTML="";
           
            if(this.value==""){
                var _oPempty1=document.createElement("option");
                _oPempty1.value=''
                _oPempty1.innerHTML='请选择市';
                _city.appendChild(_oPempty1);

                var _oPempty2=document.createElement("option");
                _oPempty2.value=''
                _oPempty2.innerHTML='请选择区';
                _area.appendChild(_oPempty2);
            }else{
                for(var i=0;i<data.length;i++){
                    if(this.value==data[i].val){  
                            for(var j=0;j<data[i].city.length;j++){  
  
                                    var _op2=document.createElement("option");
                                    _op2.value=data[i].city[j].val;  
                                    _op2.innerHTML=data[i].city[j].name;
                                    _city.appendChild(_op2);
                            }

                        for(var j=0;j<data[i].city[0].area.length;j++){
                                    var _op3=document.createElement("option");
                                    _op3.value=data[i].city[0].area[j].name;
                                    _op3.innerHTML=data[i].city[0].area[j].name;
                                    _area.appendChild(_op3);
                        }
                    }
                }
            }
        }


        _city.onchange=function(){
            _area.innerHTML="";
            for(var i=0;i<data.length;i++){
                for(var j=0;j<data[i].city.length;j++){
                    if(data[i].city[j].val==this.value){
                       var len=data[i].city[j].area.length;
                        for(var k=0;k<len;k++){
                            var _op4=document.createElement("option");
                            _op4.value=data[i].city[j].area[k].name;
                            _op4.innerHTML=data[i].city[j].area[k].name;
                            _area.appendChild(_op4);
                        }
                    }
                }
            }
        }

最终效果如下:

如图

demo1.gif

这就是使用js+json来实现简易的三级联动的效果!

对于html结构美化大家可以自行使用css样式进行美化,这里就不过多赘述了!

那么接下来,我们可以使用js+数组的形式, 也来实现一下这个三级联动的效果

JS三级联动数组数据格式 ?️

如下

var arr=['中国','美国','日本'];
        arr['中国']=['重庆市','北京市','上海市'];
        arr['美国']=['纽约','华盛顿','阿拉斯加'];
        arr['日本']=['东京','大阪','名古屋'];

        arr['重庆市']=['解放碑','沙坪坝','九龙坡'];
        arr['北京市']=['天安门','朝阳区','海淀区'];
        arr['上海市']=['黄浦江','东方明珠','黄浦区','虹口机场'];

        arr['纽约']=['皇后区','时代广场','布朗克斯区'];
        arr['华盛顿']=['林肯纪念堂','白宫','美国国会图书馆'];
        arr['阿拉斯加']=['蕨草镇'];

        arr['东京']=['东京迪士尼','银座','东京塔'];
        arr['大阪']=['天守阁','天保山海游','四天王寺'];
        arr['名古屋']=['热田神宫'];

HTML代码结构 ?

国家:<select id="country"></select>
城市:<select id="province"></select>
地区:<select id="area"></select>

javascript代码实现逻辑 ?️

function init(){
     fillData(arr,'country');
     fillData(arr['中国'],'province');
     fillData(arr['重庆市'],'area');

 }


 function fillData(arr,id){
     var obj=document.getElementById(id);
     obj.options.length=0;
     var i=0;
     var len=arr.length;
     for(;i<len;i++){
         var _Option = new Option();
         _Option.text=arr[i];
         _Option.value=arr[i];
         obj.add(_Option);
     }
 }

 function chchangePro(StrIndex){
     fillData(arr[StrIndex],'province');
     fillData(arr[arr[StrIndex][0]],'area');
 }

 function changeArea(StrIndex){
     fillData(arr[StrIndex],'area');
 }


 window.onload=function () {
     //初始化效果
     init();

     var _country=document.getElementById('country');
     var _province=document.getElementById('province');
     _country.onchange=function () {
         chchangePro(this.value);
     }

     _province.onchange=function () {
         changeArea(this.value);
     }

 }

最后实现效果

如图

demo2.gif

怎么样,js+数组也可以实现这种效果。哈哈哈哈 ???

总结想法和思路?

好了我大致总结了一下思路

如下:

  1. 最重要的就是先要把数组和JSON的数据结构理解清楚,然后把数据的存储结构先写出来.
  2. For循环的结构思路要清晰,
  3. 创建元素要在for循环中.
  4. onchange事件的使用, 当值发生变化的时候触发某一个方法.
  5. 每次调用取值函数的时候清空一下
image
image

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “?点赞” “✍️评论” “?收藏” 一键三连哦!


如果以上内容有任何错误或者不准确的地方,??欢迎在下面 ? 留个言指出、或者你有更好的想法,欢迎一起交流学习❤️❤️❤️❤️❤️

有关哇塞 我初学javascript第1天就会使用原生数组+JSON+DOM实现了国家--城市--区县三级联动数据切换效果的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  3. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  4. ruby-on-rails - 如何使用 Rack 接收 JSON 对象 - 2

    我有一个非常简单的RubyRack服务器,例如:app=Proc.newdo|env|req=Rack::Request.new(env).paramspreq.inspect[200,{'Content-Type'=>'text/plain'},['Somebody']]endRack::Handler::Thin.run(app,:Port=>4001,:threaded=>true)每当我使用JSON对象向服务器发送POSTHTTP请求时:{"session":{"accountId":String,"callId":String,"from":Object,"headers":

  5. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  6. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  7. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  8. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  9. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  10. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

随机推荐