小生初学阶段,若知识点不全和错误,还望各位大神指点!
一,基本内容
1.异步交互:客户端向服务器端发送请求,直到服务器端进行响应,这个过程中,用户可以做任何其他事情(不需要等);
2.AJAX——Asynchronous JavaScript and Xml ;客户端与服务器端进行交互,而无需刷新当前页面的技术,称之为AJAX,实现的是B/S架构下的异步交互。
3.在html中用到的<iframe src="">元素,嵌入一个网页,也是实现异步交互的技术。
4.与同步交互的区别
(1)同步交互:客户端向服务器端发送请求时,到服务器端进行响应,这个过程中,用户是不能做任何其他事情(只能等);
*执行速度相对比较慢,响应的是完整的html页面。
(2)异步交互
*执行速度相对比较快,响应的是部分数据。
二,实现ajax的异步交互步骤
1.创建XMLHttpRequest对象
function getXhr(){
//声明XMLHttpRequest对象
var xhr=null;
//根据浏览器的不同情况进行创建
if(window.XMLHttpRequest){
//表示除IE外的其他浏览器
xhr=new XMLHttpRequest();
}else{
//表示ie浏览器(8及以前版本)
xhr=new ActiveXobject('Microsoft.XMLHttp');
}
return xhr;
}
此对象特别重要,建议记住!
2.与服务器端建立连接*使用XMLHttpRequest对象的 open(method,url)方法
*method——设置当前请求的类型
*url——设置当前请求的地址
3.向服务器端发送请求*使用XMLHttpRequest对象的 send(请求参数)方法
*请求参数的格式——key=value
4.接收服务器端的响应数据(1)使用XMLHttpRequest对象的 onreadystatechange事件,监听服务器端的通信状态。
(2)使用XMLHttpRequest对象的 readyState属性,判断服务器端的当前状态(0-4)。
*0——(服务器端)尚未初始化
*1——(服务器端)正在接收
*2——(服务器端)接收完毕
*3——(服务器端)正在响应
*4——(服务器端)响应完毕
(3)使用XMLHttpRequest对象的 status属性,判断服务器端的状态码(200)。
(4)使用XMLHttpRequest对象的responseText属性,接收服务器端的响应数据。
注意:上述2中method参数有get与post,两种请求类型不同,写法也就不同。
**GET请求方式:*send()方法不起作用,但是不能被忽略! xhr.send(null);
*请求参数——添加到 URL?key=value;
*get请求类型案例:
html页面代码:
<!DOCTYPE html>
<html>
<head>
<title>实现Ajax异步交互</title>
<meta charset="utf-8" />
</head>
<body>
<input type="button" value="异步请求" id="btn">
<script>
// 实现Ajax的异步交互的步骤
var btn = document.getElementById("btn");
btn.onclick = function(){
/*
* 1. 实现Ajax主要依靠XMLHttpRequest对象
* * 创建XMLHttpRequest对象
*/
var xhr = getXhr();
/*
* 2. 与服务器端建立连接
*/
xhr.open("get","01.php?user=zhangwuji");
/*
* 3. 客户端向服务器端发送请求
*/
xhr.send(null);
/*
* 4. 客户端接收服务器端的响应
*/
xhr.onreadystatechange = function(){
// 保证服务器端响应的数据发送完毕
if(xhr.readyState == 4){
// 保证这次请求必须是成功的
if(xhr.status == 200){
// 接收服务器端的数据
var data = xhr.responseText;
// 测试
console.log(data);
}
}
}
}
// 定义创建XMLHttpRequest对象的函数
function getXhr(){
// 声明XMLHttpRequest对象
var xhr = null;
// 根据不同浏览器创建
if(window.XMLHttpRequest){
// 其他浏览器
xhr = new XMLHttpRequest();
}else{
// IE浏览器(8及之前)
xhr = new ActiveXObject("Microsoft.XMLHttp");
}
// 返回XMLHttpRequest对象
return xhr;
}
</script>
</body>
</html>
php页面代码:
<?php
// 用于处理客户端的Ajax异步请求
// 1. 接收客户端发送的请求数据
$user = $_GET['user'];
// 2. 向客户端进行响应
echo $user.' get request succesful.';
?>
**POST请求方式:
*在send方法被调用前,使用 setRequestHeader()方法设置请求头信息
固定写法:xhr.setRequestHeader("content-type","application/x-www-form-urlencoded");
POST方式请求案列:
html页面代码:<!DOCTYPE html>
<html>
<head>
<title>POST方式的Ajax</title>
<meta charset="utf-8" />
</head>
<body>
<input type="button" value="异步" id="btn">
<script>
var btn = document.getElementById("btn");
btn.onclick = function(){
// 实现Ajax的异步交互
var xhr = getXhr();
xhr.open("post","02.php");
/*
* 如果Ajax使用的是POST请求类型的话
* * 必须要在send()方法调用之前
* * 使用setRequestHeader(key,value)方法
* * 该方法用于设置请求头
*/
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xhr.send("user=zhangwuji");
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
if(xhr.status == 200){
var data = xhr.responseText;
console.log(data);
}
}
}
}
function getXhr(){
var xhr = null;
if(window.XMLHttpRequest){
xhr = new XMLHttpRequest();
}else{
xhr = new ActiveXObject("Microsoft.XMLhttp");
}
return xhr;
}
</script>
</body>
</html>
php页面代码:
<?php
// 1. 接收客户端发送的请求
$user = $_POST['user'];
// 2. 进行响应
echo $user.' post request successful.';
?>
综合案例:使用ajax实现省市/区二级联动
html代码:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>二级联动全ajax实现</title>
</head>
<body>
<select id="shengji">
<option>-请选择-</option>
</select>
<select id="city">
<option>-请选择-</option>
</select>
<script>
function getXhr(){
var xhr=null;
if(window.XMLHttpRequest){
xhr=new XMLHttpRequest();
}
else{
xhr=new ActiveXObject("Microsoft.XMLHttp");
}
return xhr;
}//创建XMLHttpRequest对象
var xhr=getXhr();
var shengji=document.getElementById("shengji");
var city=document.getElementById("city");
window.onload=function(){//页面加载完执行
xhr.open("get","ajaxejld2.php?status=1");
xhr.send(null);
xhr.onreadystatechange=function(){
if(xhr.readyState==4&&xhr.status==200){
var data=xhr.responseText;
var province=data.split(",");
for(var i=0;i<province.length;i++){
var option=document.createElement("option");
option.innerHTML=province[i];
shengji.appendChild(option);
}
}
}
}
shengji.onchange=function(){//第一个select发生改变时执行
var opts=city.getElementsByTagName("option");
for(var j=opts.length-1;j>0;j--){
city.removeChild(opts[j]);//先清空第二个select元素
}
if(shengji.value!="-请选择-"){
xhr.open("post","ajaxejld2.php");
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xhr.send("status=2&province="+shengji.value);
xhr.onreadystatechange=function(){
if(xhr.readyState==4&&xhr.status==200){
var data=xhr.responseText;
var citys=data.split(",");
for(var i=0;i<citys.length;i++){
var option=document.createElement("option");
option.innerHTML=citys[i];
city.appendChild(option);
}
}
}
}
}
</script>
</body>
</html>
php页面代码:
<?php
$status=$_REQUEST['status'];
if($status==1){
echo'重庆市,北京市,天津市,河北省';
}else{
$province=$_POST['province'];
switch($province){
case '重庆市':
echo'渝中区,渝北区,沙坪坝区,九龙坡区,两江新区,北碚区';
break;
case '北京市':
echo'东城区,西城区,海淀区,朝阳区';
break;
case '天津市':
echo'河东区,河西区,南开区';
break;
case '河北省':
echo'石家庄市,廊坊市,保定市,唐山市,秦皇岛市';
break;
}
}
?>
注:上述中数据的格式为HTML(文本格式),ajax数据格式还有XML,json;这只是原生js的操作,还可以用jquery操作,使其更加简单,后面再续写。
点击打开链接