Ajax实现一个简单的国家、省份下拉框联动

一、实现思路

     很简单的一个例子,但是在做之前如果能够把逻辑上实现进行总结,对应总结,然后对应着实现相应功能,是一个很好的编码过程。废话不多说。

     首先上一个欲实现功能的效果图,没做过任何美化:

                                                                  

       上面一个下拉列表是国家数据,下面一个下拉框需要实现与Nations中所选择的国家相对应,很简单吧?

       对此,大概提出实现思路:

       (1)Province下拉框数据来自Nations下拉框,因此首先需要初始化Nations下拉框,给与国家数据;

       (2)需要一个触发事件来引起客户端向服务器发送请求获取对应Nations的数据。这就牵涉两个方面,第一是触发事件,第二是怎么向服务器发送请求。第一个问题很简单,给Nations下拉框添加onchange事件就行;一般情况下,这样的两个下拉框都是用在类似用户注册填写资料的页面,在这种情形下不能在Nations中所选择的国家发生改变后刷新整个页面来获取省份数据,因此需要使用Ajax来实现局部请求数据。

       (3)客户端传送数据方式采用Get方式,因为这次请求是为了获得满足条件的数据,通过url传送"条件“。

       (4)服务器接收客户端传送过来的”条件“,然后从数据源(可以是数据库,也可以是缓存,也可以是某些数据变量)筛选出满足条件的数据发回给客户端。

       (5)客户端将获取服务器发过来的数据,将数据填充进Province下拉框。

        大体思路就是这样,下面开始按步骤实现。

二、代码实现

        说明:代码前台使用了Javascript,没有使用Jquery.后台使用的为ASP.NET。

         1、代码中引用的CommonAjax.js文件;

           CommonAjax.js文件中封装了两个方法,createXmlHttp()方法用于创建Ajax对象。因为在不同的浏览器中,创建Ajax对象的方法是不同的;gel()方法封装主要是为了个人代码书写方便。

           

 1 //根据不同的浏览器使用相应的方式创建异步对象
 2 function createXmlHttp() {
 3     xhobj = false;
 4     try {
 5         xhobj = new ActiveXObject("Msxml2.XMLHTTP");//iemsxml3.0+
 6     } catch (e) {
 7         try {
 8             xhobj = new ActiveXObject("Microsoft.XMLHTTP");//iemsxml2.6
 9         } catch (e2) {
10             xhobj = false;
11         }
12     }
13     if (!xhobj && typeof XMLHttpRequest != 'undefined') {//Firefox,Opera 8.0+.safari,谷歌浏览器
14         xhobj = new XMLHttpRequest();
15 
16     }
17     return xhobj;
18 }
19 //获取Dom对象
20 function gel(nodeName) {
21     var q = document.getElementById(nodeName);
22     return q;
23 }
View Code

 

         2、初始化Nations下拉框

         不多说,先上代码

          

 //国家数据
        var nationArray = [
            { "id": "1", "name": "China" },
            { "id": "2", "name": "America" },
            { "id": "3", "name": "Japanese" }
        ];
        //初始化下拉框
        function initNations() {
            var objNation = gel("nation");//获取国家下拉框
            //遍历国家数组
            for (var i = 0; i < nationArray.length; i++) {
                var nation = nationArray[i];
                var option = new Option(nation.name, nation.id);//select中的option实例化
                objNation.options.add(option);//添加数据到国家下拉框
            }
        };
View Code

         代码不难,应该都能看懂。值得一提的是,下拉框数据的组织我是采用的JSON格式,正如代码中nationArray就是JSON数据数组。

         3、前台代码、添加事件、创建异步对象

         

 1  <div style="text-align:center;">
 2         <h1>Ajax_下拉框</h1>
 3         <form id="form1" runat="server">
 4             <div>
 5                 Nations:<select id="nation" onchange="sendAjaxobj(this.value)"></select>
 6                 <br />
 7                 Province:
 8                 <select id="province"></select>
 9             </div>
10         </form>
11     </div>
View Code

       

 1 //Ajax与服务器交互
 2         function sendAjaxobj(nid) {
 3             //创建Ajax对象
 4             var xhr = createXmlHttp();
 5             //设置请求参数
 6             xhr.open("GET", "Ajax_DropdownList.aspx?nid=" + nid, true);           
 7             //设置回调函数
 8             xhr.onreadystatechange = function () {
 9                 if (xhr.readyState == 4) {
10                     if (xhr.status == 200) {
11                         var rt = xhr.responseText;
12                         //eval方法能把获取的数据当作Js代码执行,至于为什么加上括号不清楚,不加要报错;
13                         var res = eval("(" + rt + ")");
14                         //获取province下拉框
15                         var provinceData = gel("province");
16                         //在给Province添加数据时,先清空上一次的数据
17                         provinceData.length = 0;
18                         //添加数据到Province当中
19                         for (var i = 0; i < res.length; i++) {
20                             var nation = res[i];
21                             var option = new Option(nation.name, nation.id);
22                             provinceData.options.add(option);
23                         }
24                     }
25                 }
26             }
27             //xhr开始向服务器发送请求
28             xhr.send(null);
29         }
View Code

       注意,xhr对象的open第二个参数中,我在网址中添加了条件参数nid,nid为当前选中的国家的id值,服务器根据这个id值筛选数据。

      4、服务器获取数据,并返回数据

       

 1 namespace FirstForm
 2 {
 3     //model层数据,出于偷懒考虑没添加model层
 4     public class Province
 5     {
 6         public int id { get; set; }
 7         public string name { get; set; }
 8         public int nationId { get; set; }
 9     }
10     public partial class Ajax_DropdownList : System.Web.UI.Page
11     {
12         //出于简化没有通过在数据库查询数据,而是直接在服务器端直接给可能的省份添加了一个初值
13         List<Province> model = new List<Province>() {            
14              new Province(){id=1, name="BeiJing",nationId=1},
15                            new Province(){id=2, name="GuiYang",nationId=1},
16                            new Province(){id=3, name="QianXi",nationId=1},
17                            new Province(){id=1, name="NewYork",nationId=2},
18                            new Province(){id=2, name="Washinton",nationId=2},
19                            new Province(){id=3, name="Miami",nationId=2},
20                            new Province(){id=1, name="Tokyo",nationId=3}           
21             };
22         protected void Page_Load(object sender, EventArgs e)
23         {
24             string nid = Request.QueryString["nid"];//获取客户端通过url发送过来的数据
25             StringBuilder sbHtml = new StringBuilder("["); //这个不用说吧          
26             if (!IsPostBack)
27             {
28                 if (!string.IsNullOrEmpty(nid))
29                 {
30                     foreach (var item in model)
31                     {
32                         if (item.nationId.ToString() == nid)//筛选数据
33                         {
34                             //发送的数据也是模拟Json数据格式的字符串
35                             sbHtml.Append("{'id': '" + item.id + "', 'name': '" + item.name + "','nationId':'" + item.nationId + "'},");
36                         }
37                     }
38                     Response.Write(sbHtml.ToString().Substring(0, sbHtml.Length - 1) + "]");
39                     Response.End();
40                 }
41             }
42            
43                           
44             
45         }
46     }
47 }
View Code

      5、客户端获取数据,并填如Province下拉框

       这一不的代码在第三不中已经贴出,这里重复贴一次:

     

 1  xhr.onreadystatechange = function () {
 2                 if (xhr.readyState == 4) {
 3                     if (xhr.status == 200) {
 4                         var rt = xhr.responseText;
 5                         //eval方法能把获取的数据当作Js代码执行,至于为什么加上括号不清楚,不加要报错;
 6                         var res = eval("(" + rt + ")");
 7                         //获取province下拉框
 8                         var provinceData = gel("province");
 9                         //在给Province添加数据时,先清空上一次的数据
10                         provinceData.length = 0;
11                         //添加数据到Province当中
12                         for (var i = 0; i < res.length; i++) {
13                             var nation = res[i];
14                             var option = new Option(nation.name, nation.id);
15                             provinceData.options.add(option);
16                         }
17                     }
18                 }
19             }
View Code

 三 最后

     很简单的过程,代码也不多,写出来,整理思路,以后备用。

转载于:https://www.cnblogs.com/Jnw-qianxi/archive/2013/05/15/Ajax.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的HTML实现省份和城市的下拉框联动的代码: ```html <!DOCTYPE html> <html> <head> <title>省份和城市下拉框联动</title> <meta charset="UTF-8"> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script> $(document).ready(function(){ // 定义省份和城市数据 var provinceData = { "北京市": ["北京市"], "上海市": ["上海市"], "天津市": ["天津市"], "重庆市": ["重庆市"], "河北省": ["石家庄市", "唐山市", "秦皇岛市", "邯郸市", "邢台市", "保定市", "张家口市", "承德市", "沧州市", "廊坊市", "衡水市"], "山西省": ["太原市", "大同市", "阳泉市", "长治市", "晋城市", "朔州市", "晋中市", "运城市", "忻州市", "临汾市", "吕梁市"], "辽宁省": ["沈阳市", "大连市", "鞍山市", "抚顺市", "本溪市", "丹东市", "锦州市", "营口市", "阜新市", "辽阳市", "盘锦市", "铁岭市", "朝阳市", "葫芦岛市"], }; // 初始化省份下拉框 var provinceSelector = $("#province"); for (var province in provinceData) { var option = $("<option>").val(province).text(province); provinceSelector.append(option); } // 省份下拉框改变事件 provinceSelector.change(function(){ var province = $(this).val(); var cityData = provinceData[province]; var citySelector = $("#city"); citySelector.empty(); for (var i in cityData) { var option = $("<option>").val(cityData[i]).text(cityData[i]); citySelector.append(option); } }); }); </script> </head> <body> <label for="province">省份:</label> <select id="province"> <option value="">请选择</option> </select> <label for="city">城市:</label> <select id="city"> <option value="">请选择</option> </select> </body> </html> ``` 该代码使用了jQuery库来简化DOM操作。在代码中,首先定义了一个`provinceData`对象,其中键为省份名称,值为该省份下的城市数组。然后通过jQuery来初始化省份下拉框,以及定义其改变事件。当省份下拉框改变时,根据选中的省份,动态生成相应的城市下拉框选项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值