Ajax详解及其案例分析

2019-09-14 07:07:01王冬梅

7 使用Ajax实现级联的下拉列表

7.1 问题

实现市区的级联下拉列表。即,选择城市后,动态加载该城市包含的区域信息。

7.2 方案

下拉列表发生onchange事件时,将选中的城市对应的value发送给服务器端,服务器端收到这个城市拼音 缩写后,进行比对,返回区域的组合信息。客户端收到信息后分别按照“;“和”,“进行分割,然后构建option对象,添加到区域对应的下拉列表中。

7.3 步骤

步骤一: 修改my.js文件

修改my.js文件,增加两个便于定位html页面中元素的方法,以及便于读取元素value属性的方法。

function $(id) {
  return document.getElementById(id);
}
function $F(id) {
  return $(id).value;
}

步骤二: 新建select.html文件

编写页面中的下拉列表。并且在onchange事件时,将选中项的value属性作为参数传给getCity方法。

<body>
    <!-- Ajax实现级联下拉列表 -->
    <select id="s1" style="width: 120px;" onchange="getCity(this.value);">
      <option value="bj">
        北京
      </option>
      <option value="sh">
        上海
      </option>
      <option value="gz">
        广州
      </option>
    </select>
    <select id="s2" style="width: 120px;">
    </select>
  </body>

步骤三: 编写Ajax代码

<script type="text/javascript">
    function getCity(v1) {
      var xhr = getXhr();    
      xhr.onreadystatechange = function() {
        if (xhr.readyState == 4 && xhr.status==200) {
          var txt = xhr.responseText;
          //静安,ja;黄浦,hp;浦东新,pdx
          var strs = txt.split(';');
          //先清空s2
          $('s2').innerHTML = '';
          for (i = 0; i < strs.length; i++) {
            var str1s = strs[i].split(',');
            /*构造一个Option对象 */
            var op = new Option(str1s[0], str1s[1]);
            /* options是select的一个属性,
               其值是一个数组。数组中的元素是Option对象。
            */
            $('s2').options[i] = op;
          }
        }
      };
     xhr.open('get', 'getCity.do?name=' + v1, true);
      xhr.send(null);
    }
  </script>

步骤四: 修改ActionServlet,添加对getCity.do的请求处理

else if(path.equals("/getCity")){//城市列表联动
      String name = request.getParameter("name");
      if("bj".equals(name)){
        out.println("朝阳,cy;东城,dc");
      }else if("sh".equals(name)){
        out.println("静安,ja;黄浦,hp;浦东新,pdx");
      }else{
        out.println("白云,by;番禺,py");
      }
    }

步骤五:访问,查看运行结果

7.4 完整代码