ajax_get/post_两级联动
使用ajax实现菜单联动
通常情况下,GET请求用于从服务器上获取数据,POST请求用于向服务器发送数据。
需求:选择第一个下拉框的值,根据第一个下拉框的值显示第二个下拉框的值
- 首先使用GET方式。
客户端HTML页面显示第一个下拉选择框,给当前下拉选择框选择某个选项后,通过XMLHttpRequest向服务器发送请求,请求动态显示第二个下拉选择框。下面是对应的HTML页面的代码。
程序清单:Ajax02request/get/first.html
|
<!DOCTYPE html> <html> <head> <meta name="author" content="silvan" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>发送GET请求</title> <!-- 给select标签添加样式 --> <style type="text/css"> select { width: 160px; font-size: 11pt; } </style> </head> <body> <select name="first" id="first" onchange="change(this.value);"> <option value="0">---请选择---</option> <option value="1" >中国</option> <option value="2">美国</option> <option value="3">日本</option> </select> <select name="second" id="second"></select> <script type="text/javascript"> // 定义了XMLHttpRequest对象 var xmlrequest; // 完成XMLHttpRequest对象的初始化 function createXMLHttpRequest(){ if(window.XMLHttpRequest){ // DOM 2浏览器 xmlrequest = new XMLHttpRequest(); }else if (window.ActiveXObject){ // IE浏览器 try{ xmlrequest = new ActiveXObject("Msxml2.XMLHTTP"); }catch (e){ try{ xmlrequest = new ActiveXObject("Microsoft.XMLHTTP"); }catch (e){ } } } } // 事件处理函数,当下拉列表选择改变时,触发该事件 function change(id){ // 初始化XMLHttpRequest对象 createXMLHttpRequest(); // 设置请求响应的URL var uri = "second.jsp?id=" + id; // 设置处理响应的回调函数 xmlrequest.onreadystatechange = processResponse; // 打开与服务器响应地址的连接 xmlrequest.open("GET", uri, true); // 发送请求 xmlrequest.send(null); } // 定义处理响应的回调函数 function processResponse(){ //响应完成且响应正常 if (xmlrequest.readyState == 4){ if (xmlrequest.status == 200){ // 将服务器响应以$符号分隔成字符串数组 var cityList = xmlrequest.responseText.split("$"); // 获取用于显示菜单的下拉列表 var displaySelect = document.getElementById("second"); // 将目标下拉列表清空 displaySelect.innerHTML = null; // 以字符串数组的每个元素创建option, // 并将这些选项添加到下拉列表中 for (var i = 0 ; i < cityList.length ; i++){ // 创建一个<option.../>元素 var op = document.createElement("option"); op.innerHTML = cityList[i]; // 将新的选项添加到列表框的最后 displaySelect.appendChild(op); } }else{ //页面不正常 window.alert("您所请求的页面有异常。"); } } } // 指定页面加载完成后指定change(id)函数 document.body.onload = change(document.getElementById("first").value); </script> </body> </html> |
采用GET请求将父菜单的ID作为参数发送,根据ID显示第二个下拉框的值。服务器响应页面的代码如下。
程序清单:Ajax02request/get/second.jsp
|
<%@ page contentType="text/html; charset=UTF-8" language="java"%> <% String idStr = (String)request.getParameter("id"); int id = idStr == null ? 1 : Integer.parseInt(idStr); switch(id){ case 1: out.println("上海$广州$北京"); break; case 2: out.println("华盛顿$纽约$加州"); break; case 3: out.println("东京$大板$福冈"); break; } %> |
上面jsp页面作为服务器响应非常简单:先读取请求参数,当请求id为1时,返回三个中国城市;当请求id为2时,返回三个美国城市;当请求id为3时,返回三个日本城市。
在浏览器中浏览该页面,并改变左边下拉列表的选中项,将看到下图效果:
- 使用POST方式
POST请求的适应性更广,可使用更大的请求参数。而且POST请求的请求参数在页面跳转时,不能在链接地址中直接看到,保密性更好。因此在使用Ajax发送请求时,尽量采用POST方式而不是GET方式发送请求。发送POST请求通常需要如下三个步骤:
- 使用open方法打开连接时,指定使用POST方式发送请求。
- 设置正确的请求头,POST请求通常应设置Content-Type请求头。
- 发送请求,把请求参数转为查询字符串,将该字符串作为send()方法的参数。
对于上面的应用,使用POST方式实现,只需要改一个请求的发送方法,如下所示:
|
// 事件处理函数,当下拉列表选择改变时,触发该事件 function change(id) { // 初始化XMLHttpRequest对象 createXMLHttpRequest(); // 设置请求响应的URL var uri = "second.jsp"; // 设置处理响应的回调函数 xmlrequest.onreadystatechange = processResponse; // 设置以POST方式发送请求,并打开连接 xmlrequest.open("POST", uri, true); // 设置POST请求的请求头,表示数据被编码为名称/值对 xmlrequest.setRequestHeader("Content-Type" , "application/x-www-form-urlencoded"); // 发送请求 xmlrequest.send("id="+id); } |
其余的部分则无须改变,应用的执行效果与采用GET方式发送请求的效果完全一样。事实上,即使采用POST方式发送请求,一样可以将请求参数附加在请求的URL之后。如果send方法没有请求参数,应传入null,因为有些浏览器规定了send方法必须传入参数。代码如下:
|
// 事件处理函数,当下拉列表选择改变时,触发该事件 function change(id) { // 初始化XMLHttpRequest对象 createXMLHttpRequest(); // 设置请求响应的URL var uri = "second.jsp?id="+id; // 设置处理响应的回调函数 xmlrequest.onreadystatechange = processResponse; // 设置以POST方式发送请求,并打开连接 xmlrequest.open("POST", uri, true); // 设置POST请求的请求头 xmlrequest.setRequestHeader("Content-Type" , "application/x-www-form-urlencoded"); // 发送请求 xmlrequest.send(null); } |
ajax_get/post_两级联动的更多相关文章
- ajax实现无刷新两级联动DropDownList
ajax实现的无刷新三级联动 http://zhangyu028.cnblogs.com/articles/310568.html 本文来自小山blog:http://singlepine.cnblo ...
- JS练习:两级联动
代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title ...
- Combobox下拉框两级联动
下拉框的两级联动是我们开发中经常遇到一种情况.比如一个学生管理系统中,根据年级.科目及姓名查询学生考试成绩,年级和科目都是硬盘中的有限数据(数据库)而学生则可以有用户手动指定,这时在数据库中有年级和科 ...
- Jquery实现两级联动
最后结果如下: 关键代码如下: <select name="customerCondition['credibilityBegin']" id="credibili ...
- ASP_NET实现界面无刷新的DropdownList两级联动效果
所谓DropdownList联动,也就是在选一个DropdownList的时候使另外一个DropdownList的内容更新(如选省份时显示所属城市),按常规的方法那就是在第一个DropdownList ...
- JQuery EasyUI combobox 省市两级联动
表名:province 结构如下 CallIn.tpl 模板页 <select id="consult_province" name="consult_provi ...
- JS 省市两级联动(不带地区版本)
基于网上找的一个版本改造,因为项目需求不需要地区只要省.市,所以做了改版,两个input上直接取出了数据 <html> <head> <script src=" ...
- 踩iviewui中Select 选择器两级联动,重置查询条件时第二级数据无法清除的坑
小颖公司最近做的项目用的vue+iviewui+axios,在做项目的过程中,遇到一个问题: 二级联动的下拉框,第一个下拉框一直都有值,第二个下拉框是在选择了第一个下拉框之后采取调用ajax获取其值, ...
- Thinkphp 两级联动
<!-- 前端代码部分--><div class="pop-movegroup" id="salesmanBox"> <dl> ...
随机推荐
- ArrayBuffer and Base64
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- ORM框架SQLAlchemy与权限管理系统的数据库设计
SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用对象关系映射进行数据库操作,即:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果. 执行流 ...
- seajs笔记
Amd和Cmd的区别有哪些? 1. 对于依赖的模块,AMD 是提前执行,CMD 是延迟执行.不过 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同).CMD 推崇 ...
- 约瑟夫环C#解决方法
/*约瑟夫环 (问题描述) 约瑟夫问题的一种描述是:编号为1,2,......n,的n个人按顺时针方向围坐一圈,每个人持有一个密码(正整数).一开始任意选 一个正整数作为报数的上限值m,从第一个人开始 ...
- Unity学习资料
前段时间刚简单接触下Spring.net,刚会简单注入,最近接手一项目确是用的Unity,网上找了一些很好的教程资料 算是入门了,高手已经写的很好了,我就转个链接吧: Unity V3 初步使用 —— ...
- [转载] Quartz作业调度框架
转载自http://yangpanwww.iteye.com/blog/797563 Quartz 是一个开源的作业调度框架,它完全由 Java 写成,并设计用于 J2SE 和 J2EE 应用中.它提 ...
- [转载] 解读ClassLoader
转载自http://www.iteye.com/topic/83978 ClassLoader一个经常出现又让很多人望而却步的词,本文将试图以最浅显易懂的方式来讲解 ClassLoader,希望能对不 ...
- riot.js教程【五】标签嵌套、命名元素、事件、标签条件
前文回顾 riot.js教程[四]Mixins.HTML内嵌表达式 riot.js教程[三]访问DOM元素.使用jquery.mount输入参数.riotjs标签的生命周期: riot.js教程[二] ...
- Composer笔记
安装 windows中安装Composer 一般来说,windows下安装composer有两种办法,一种是直接下载并运行Composer-Setup.exe,这种方法在中国似乎很难完成安装.另一种就 ...
- iOS11、iPhone X、Xcode9 适配
更新iOS11后,发现有些地方需要做适配,整理后按照优先级分为以下三类: 1.单纯升级iOS11后造成的变化: 2.Xcode9 打包后造成的变化: 3.iPhoneX的适配 一.单纯升级iOS11后 ...