ajax使用详解

一ajax的基本原理

wKioL1MTPZ6gn-KjAADfQWPTh6I563.jpg

1创建XmlHttpRequest对象。

2创建请求。

3根据监控的readyState值的变化实现当服务器返回数据时调用回调函数

4发送请求

5接收服务器返回的数据(该步骤可以和会和步骤3合并)

二ajax使用基本流程

ajax的使用主要是实现上面的原理图。

1创建XMLHttpRequest对象,由于这段代码是固定的夜视第一步,所以我们一般将其封装为一个函数createXMLHttpRequest();

function createXMLHttpRequest(){
var request;
if(window.XMLHttpRequest){//火狐
request= new  XMLHttpRequest();
}else if{
request = new ActiveXObject("Msxml2.XMLHTTP");//IE
}
return request;
}

2使用XMLHttpRequest对象创建请求

wKiom1MTQ4bAl4XaAAB9B8OVABc746.jpg

var req=createXMLHttpRequest();
req.open("get","testAjaxServlet");

3监视response状态,写回调函数处理服务器返回的数据

(1)服务端响应

wKiom1MTSKmwU-2_AACl6X4HfMQ690.jpg

(2)XMLHttpRequest的readyState

wKiom1MTSe7wWVX5AAECqTfyuOU367.jpg

req.onreadystatechange=function(){
if(req.ready==4){
var result=request.responseTest;//得到服务端返回的数据
document.getElementById("div2").innerHTML=result;//js操作DOM将数据写到页面对象中,实现局部刷新
}
}

注:上述代码仅仅是一个实例,说明了在什么状态下接受数据,显示数据

4使用XMLHttpRequest对象发送请求

req.send(null);//如果不写null,火狐会报错

三ajax的传参方式和接受数据的方式

注:由于开发需要,传参方式和接受数据的形式会不同,接下来重点讨论

1两种传参方式post和get

get方式:更简单也更快,并且在大部分情况下都能用,容易被缓存(因为是小数据)

post方式:

  • 无法使用缓存文件(更新服务器上的文件数据库

  • 向服务器发送大量数据(POST没有数据量限制)

  • 发送包含未知字符的用户输入时,POST比GET更稳定也更可靠

2ajax接受数据的方式

(1)普通文本数据

req.responseTest得到返回的文本数据

(2)XML数据

1)处理

a)服务端

response.setContentType("test/xml;charset=utf-8");//通过ajax写xml数据最好使用utf-8
response.getWriter().println("<resume><name>朱元璋</name></resume>");

b)客户端

req.responseXML.getElementsByTagName("name")[0].firstChild.data;

2)评价

a)优势

1xml数据通用。有很多编辑、解析工具

2xml标记属性、以及xml命名空间等,从而写出非常通用的程序。

b)劣势

1js解析xml的难度较大,尤其是在浏览器差异方面。

2xml数据经常有冗余现象。

(3)JSON(javascriptobjectnative)

1)处理

a)servlet中

sb.append("{name:'朱元璋',age:'32',job:'皇帝'}");
sb.append("[{age:1,name:'a'},{age:2,name:'b'},{age:3,name:'c'}]");//作为对象数组返回

b)浏览器端

var a=req.responseTest;
eval("var c="+a);//利用eval函数将返回的文本转化成js对象

2)评价

a)优势

1解析容易,经过eval执行后直接解析为js对象,不需要经过其他中间步骤

2可以表达比较复杂的数据组织关系

3甚至可以通过json方式直接执行服务器端传来的js函数

b)劣势

1xml属性和命名空间不能直接处理

四ajax实例

1搜索殷勤预览功能

2googlesuggest功能

3ajax三级联动

4拖曳效果实现购物车

5ajax树结构

6ajax面板效果

五ajax类库的封装

工具类:AjaxUtil.js

var AjaxUtil = {
// 基础选项
options : {
method : "get",// 默认提交的方法,get post
url : "",// 请求的路径 required
params : {},// 请求的参数
type : 'text',// 返回的内容的类型,text,xml,json
callback : function() {
}// 回调函数 required
},// 创建XMLHttpRequest对象
createRequest : function() {
var xmlhttp;
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");// IE6以上版本
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");// IE6以下版本
} catch (e) {
try {
xmlhttp = new XMLHttpRequest();
if (xmlhttp.overrideMimeType) {
xmlhttp.overrideMimeType("text/xml");
}
} catch (e) {
alert("您的浏览器不支持Ajax");
}
}
}
return xmlhttp;
},// 设置基础选项
setOptions : function(newOptions) {
for ( var pro in newOptions) {
this.options[pro] = newOptions[pro];
}
},// 格式化请求参数
formateParameters : function() {
var paramsArray = [];
var params = this.options.params;
for ( var pro in params) {
var paramValue = params[pro];
paramsArray.push(pro + "=" + paramValue);
}
return paramsArray.join("&");
},// 状态改变的处理
readystatechange : function(xmlhttp) {
// 获取返回值
var returnValue;
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
switch (this.options.type) {
case "xml":
returnValue = xmlhttp.responseXML;
break;
case "json":
var jsonText = xmlhttp.responseText;
if(jsonText){
returnValue = eval("(" + jsonText + ")");
}
break;
default:
returnValue = xmlhttp.responseText;
break;
}
if (returnValue) {
this.options.callback.call(this,returnValue);
} else {
this.options.callback.call(this);
}
}
},// 发送Ajax请求
request : function(options) {
var ajaxObj = this;
// 设置参数
ajaxObj.setOptions.call(ajaxObj,options);
// 创建XMLHttpRequest对象
var xmlhttp = ajaxObj.createRequest.call(ajaxObj);
// 设置回调函数
xmlhttp.onreadystatechange = function() {
ajaxObj.readystatechange.call(ajaxObj,xmlhttp);
};
// 格式化参数
var formateParams = ajaxObj.formateParameters.call(ajaxObj);
// 请求的方式
var method = ajaxObj.options.method;
var url = ajaxObj.options.url;
if ("GET" === method.toUpperCase()) {
url += "?" + formateParams;
}
// 建立连接
xmlhttp.open(method,url,true);
if ("GET" === method.toUpperCase()) {
//发送请求
xmlhttp.send(null);
} else if ("POST" === method.toUpperCase()) {
// 如果是POST提交,设置请求头信息
xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
//发送请求
xmlhttp.send(formateParams);
}
}
};

使用实例

function findUser() {
var userid = $("userid").value;
if (userid) {
AjaxUtil.request({
url:"servlet/UserJsonServlet",params:{id:userid},type:'json',callback:process
});
}
}
function process(json){
if(json){
$("id").innerHTML = json.id;
$("username").innerHTML = json.username;
$("age").innerHTML = json.age;
}
else{
$("msg").innerHTML = "用户不存在";
$("id").innerHTML = "";
$("username").innerHTML = "";
$("age").innerHTML = "";
}
}
function $(id) {
return document.getElementById(id);
}

相关文章

JS原生Ajax操作(XMLHttpRequest) GET请求 POST请求 兼容性问题 利用iframe模拟ajax 实现表单提交的返回...
AJAX 每日更新前端基础,如果觉得不错,点个star吧 &#128515; https://github.com/WindrunnerMax/E...
踩坑Axios提交form表单几种格式 前后端分离的开发前后端, 前端使用的vue,后端的安全模块使用的SpringSe...
很早就听闻ajax的名声,但是却一直不知道怎么用,今天自己捣鼓了一下,竟然会用了,哈哈哈哈。 为了防止...
需要在服务器上进行哈 jquery的ajax方法: // jquery请求 $.ajax({ url: &quot;./server/slider.js...
Ajax函数封装ajax.js // Get / Post // 参数 get post // 是否异步 // 如何处理响应数据 // URL // var...