在学习ajax技术之前,我们看下传统的利用form表单的方式与后台进行数据交互的方式。
代码演示如下:
<!DOCTYPE html>
<html>
<head>
<title>testform1.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body>
<!--
此时form中有三个参数:
1.action:指向一个uri地址(由后台程序员提供);
2.method:表示请求的方法,有get和post两种方式,
get:会将传的数据显示在地址栏上,而且get请求在服务器端编码需要特别的处理。
所以,如果不是特别要求用get请求方式,尽量就不要用get请求。
post:不会将数据显示在地址栏,但是这种请求方式也不安全,用专业的抓包工具可以在路由器端抓到你的信息,所以建议不要使用公共网络
-->
<form action="ajax.do" method="post" enctype="application/x-www-form-urlencoded">
用户名:<input type="text" id="username" name="username">
密码:<input type="password" id="password" name="password">
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
</body>
</html>
代码运行结果(get方式):
post方式运行结果:
由上面两个图片可以看出,虽然post请求数据不会被拼接到地址栏上,但是我们利用专业的网络抓包工具依然可以抓取到数据。所以建议大家安全用网。
看了上面传统的与后台交互数据的方式,我们发现,每次我们与后台交互时都要刷新一次页面,这样交互方式效率很低。下面我们就来介绍一下不用刷新页面就可以与后台进行交互的ajax方式吧。
代码演示如下:
<!DOCTYPE html>
<html>
<head>
<title>testajax.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
<script type="text/javascript">
function getData(){
/**
* ajax的使用分四步走
*/
//1、创建XMLHttpRequest对象,注意,IE6的兼容问题
var xhr=new XMLHttpRequest();
//2.打开连接,open方法有三个参数
/**
* 第一个是访问的请求方式
* 第二个是访问服务器的URL
* 第三个是一个Boolean值,true表示异步,
* false表示同步,一般为异步,默认是true
*
* 当请求是GET时,参数可以直接在URL后面拼接,如:
* ajax.do?name=liujianhong&password=123
* 当参数拼接时,一定要加?表示携带参数,当存在多个参数时,
* 每个参数间使用&拼接,注意参数时键值对的方式,以等号连接
*/
xhr.open("GET", "ajax.do",true);
//3、ajax的回调函数
xhr.onreadystatechange=function(){
/**
* 注意:回调函数会触发好几次,但是我们一般只会使用最后一次
* 就是请求完成的触发,readState 等于4的时候
*/
/**
* 0 请求未初始化(在调用 open() 之前)
* 1 请求已提出(调用 send() 之前)
* 2 请求已发送(这里通常可以从响应得到内容头部)
* 3 请求处理中(响应中通常有部分数据可用,但是服务器还没有完成响应)
* 4 请求已完成(可以访问服务器响应并使用它)
*/
/**
* readyState等于4表示请求已经结束,服务器响应完成
* status表示http请求的状态,200表示正常响应
* 400表示资源不可达(找不到)
* 500表示服务器端错误
*/
if(xhr.readyState==4 && xhr.status ==200){
//说明请求完成,并且成功
console.log(xhr.responseText);//得到服务器端的文本数据
console.log(xhr.responseXML);//得到服务器端的XML数据
}
};
/**
* 发送数据,如果没有数据,可以不传递数据或者传递null,如:xhr.send(null);
* 如果post请求传递数据,则这样写
* 首先设置一下xhr的请求头信息
* xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
* 再这样传递参数
* xhr.send(name=liujianhong&password=123);
*/
xhr.send();
}
//下面代码是为了兼容IE6及其以下版本,现在可以不做考虑
/* function ajaxFunction() {
var xmlHttp;
try {
// Firefox, Opera 8.0+, Safari
xmlHttp = new XMLHttpRequest();
} catch(e) {
// Internet Explorer
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch(e) {
alert("您的浏览器不支持AJAX!");
return false;
}
}
}
return xmlHttp;
}*/
</script>
</head>
<body>
<button onclick="getData();">clickMe</button>
</body>
</html>
运行结果如下:
可以看出,此时不用刷新整个页面就可以实现与后台进行交互,这大大增强了用户的页面体验。
Ajax的使用包括了四步:
1、得到XMLHttpRequest对象,注意如果要兼容IE6则使用我注释的代码
2、使用XMLHttpRequest对象的open方法,注意参数问题
3、Ajax的回调函数,服务器响应后,得到数据的处理
4、发送请求send方法。
我们知道,从后台传过来数据的方式有两种:json数据类型,xml类型。
下面我们演示一下怎样处理用后台传过来的json类型。
<!DOCTYPE html>
<html>
<head>
<title>index03.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
<script>
function getData(node){
var id = node.value;
var xhr=new XMLHttpRequest();
xhr.open("POST","personJson.do?did="+id,true);
xhr.onreadystatechange=function(){
if(xhr.readyState==4 && xhr.status==200){
var s=xhr.responseText;
//console.log(typeof json);//string
var json=eval(s);
//console.log(json);//[object,object,object,object];
var str="";
str +="<table border='1' cellspacing=0>";
for(var i=0;i<json.length;i++){
//console.log(json[i]);//Object {id: 21, name: "孙悟空", age: 132}, Object {id: 22, name: "猪八戒", age: 133},Object {id: 23, name: "沙和尚", age: 134},Object {id: 24, name: "唐和尚", age: 135}
str +="<tr>";
var p=json[i];
//console.log(p);//Object {id: 21, name: "孙悟空", age: 132}, Object {id: 22, name: "猪八戒", age: 133},Object {id: 23, name: "沙和尚", age: 134},Object {id: 24, name: "唐和尚", age: 135}
for(var j in p){
//console.log(p[j]);
str +="<td style='padding:5px'>"+p[j]+"</td>";
}
str +="</tr>";
}
str +="</table>";
document.getElementById("content").innerHTML=str;
}
};
xhr.send();
}
</script>
</head>
<body>
<p>i am a page.</p>
<select onchange="getData(this);">
<option value="1">凡人组</option>
<option value="2">明星组</option>
<option value="3">神仙组</option>
</select>
<br>
<div id="content"></div>
</body>
</html>
代码运行结果如下:
上面我们学习了javascript使用ajax接收json格式数据的方法,下面我们来学习一下javascript使用ajax接收xml格式数据的方法.
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
window.onload = init;
function init() {
//1、获取部门节点
var dn = document.getElementById("dep");
//2、为该节点创建onchange
dn.onchange = getPerson
//3、创建一个getPerson的方法来处理事件
}
function getPerson() {
var did = this.value;
//1、获取XMLHttpRequest;
var xhr = new XMLHttpRequest();
//2、通过xhr来打开页面,使用POST
xhr.open("POST", "person.do", true);
xhr.onreadystatechange = function() {
//3、处理请求
if (xhr.readyState == 4 && xhr.status == 200) {
//3.1、获取xml节点
var xmlDoc = xhr.responseXML;
//3.2、获取所有的person节点
var pns = xmlDoc.getElementsByTagName("person");
//3.3、遍历所以节点,获取id,name等信息
var node = "";
for (var i = 0; i < pns.length; i++) {
node += getValueByProp(pns[i], "id") + "----------"
+ getValueByProp(pns[i], "name") + "----------"
+ getValueByProp(pns[i], "age") + "<br/>"
}
//3.4、写入到persons
document.getElementById("persons").innerHTML = node;
}
}
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send("did=" + did);
//4、发送信息,需要传入did
}
//根据节点获取值
function getValueByProp(node, prop) {
return (node.getElementsByTagName(prop))[0].firstChild.nodeValue;
}
</script>
</head>
<body>
<select id="dep">
<option value="1">普通组</option>
<option value="2">明星组</option>
<option value="3">西游组</option>
</select>
<div id="persons"></div>
</body>
</html>
运行结果如下:
既然js有使用ajax的式,jquery肯定也有啊,下面我们就来介绍下jquery使用ajax的方法。
1.首先演示jquery.load()方法。
语法:
$(selector).load(URL,data,callback);
参数解析:
必需的 URL: 参数规定您希望加载的 URL。
可选的 data :参数规定与请求一同发送的查询字符串键/值对集合。
可选的 callback: 参数是 load() 方法完成后所执行的函数名称。
代码演示如下:
//1.jquery.load():加载页面片段(从服务器端加载数据)
//jquery_load.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery-1.11.1.js" ></script>
<script type="text/javascript">
//通过路径加载一个静态页面
$(function(){
$("#content").load("a.html");//此时页面加载了a.html页面的内容
});
</script>
</head>
<body>
<div id="content">1111</div>
</body>
</html>
//a.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈</h1>
</body>
</html>
运行结果如下显示:
2.jquery.get();方法
语法:
$.get(URL,callback);
参数:
必需的 URL 参数规定您希望请求的 URL。
可选的 callback 参数是请求成功后所执行的函数名。
代码演示如下:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery-1.11.1.js"></script>
<script type="text/javascript">
$(function() {
$("#dep").on("change", getPerson);
});
function getPerson() {
var did = this.value;
//get方法默认向服务器传值的方式是(拼接在uri后面):"personJson.do?username=liyanan&password=1234"(?:说明我要向服务器传递参数,&参数间分离)
$.get("personJson.do",{"did" : did},
function(data) {
var ps = eval(data);
var node = "";
for(var i = 0; i < ps.length; i++) {
node += ps[i].id + "--------" + ps[i].name + "--------" +
ps[i].age + "<br/>";
}
document.getElementById("persons").innerHTML = node;
}
);
}
</script>
</head>
<body>
<select id="dep">
<option value="1">普通组</option>
<option value="2">明星组</option>
<option value="3">西游组</option>
</select>
<div id="persons"></div>
</body>
</html>
3.jquery.post();与上面get()方法类似,
代码演示如下:
<!DOCTYPE html>
<html>
<head>
<title>jqueryAjax.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
<script type="text/javascript" src="js/jquery-1.11.1.js" ></script>
<script>
$(function(){
console.log($(".content"));
});
/*function getData(node){
//console.log(node);//node指向整个select
//var id=node.value;//1,2,3
var str = "";
for (var i = 0; i < data.length; i++) {
var p = data[i];
str += p.id+"-----------"+p.name+"-----------"+p.age+"<br>";
}
content.innerHTML = str;
},"json");
}*/
function getData(node) {
//console.log($("select").serialize());
var id = node.value;
//$("select").serializeArray();serializeArray() 方法通过序列化表单值来创建对象(name 和 value)的数组。
//$("select").serialize() 方法通过序列化表单值创建 URL 编码文本字符串.您可以选择一个或多个表单元素(如输入和/或文本区),或表单元素本身。序列化的值可在生成 AJAX 请求时用于 URL 查询字符串中。
$.post("personJson.do",$("select").serializeArray(),function(data){
//console.log(data);
//var data = eval(data);
var str = "";
for (var i = 0; i < data.length; i++) {
var p = data[i];
str += p.id+"-----------"+p.name+"-----------"+p.age+"<br>";
}
content.innerHTML = str;
},"json");
}
</script>
</head>
<body>
<select onchange="getData(this)" name="did">
<option value="1">凡人组</option>
<option value="2">明星组</option>
<option value="3">神仙组</option>
</select>
<div id="content"></div>
</body>
</html>