首页 > 其他 > 详细

ajax使用详解

时间:2014-03-03 18:06:09      阅读:416      评论:0      收藏:0      [点我收藏+]

一ajax的基本原理

bubuko.com,布布扣

   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对象创建请求

bubuko.com,布布扣    

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

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

        (1)服务端响应

bubuko.com,布布扣

       (2)XMLHttpRequest的readyState

bubuko.com,布布扣

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 更稳定也更可靠

2 ajax接受数据的方式

   (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)优势

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

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

            b)劣势

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

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

   (3)JSON(javascript  object  native)

      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)劣势

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

四ajax实例

     1搜索殷勤预览功能

     2 google  suggest功能

     3 ajax三级联动

     4 拖曳效果实现购物车

     5 ajax树结构

     6 ajax面板效果

五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);
}

 

本文出自 “程序思考” 博客,请务必保留此出处http://3821274.blog.51cto.com/3811274/1366032

ajax使用详解,布布扣,bubuko.com

ajax使用详解

原文:http://3821274.blog.51cto.com/3811274/1366032

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!