深入理解JavaScript中Ajax


Posted in Javascript onAugust 02, 2016

Ajax不是一种新的编程语言,而是使用现有标准的新方法。AJAX可以在不重新加载整个页面的情况下,与服务器交换数据。这种异步交互的方式,使用户单击后,不必刷新页面也能获取新数据。

XMLHttpRequest对象

Ajax的核心是XMLHttpRequest对象(XHR)。XHR为向服务器发送请求和解析服务器响应提供了接口。能够以异步方式从服务器获取新数据。

在浏览器中创建对象(只支持IE7及更高的版本):

var xhr = new XMLHttpRequest();

XHR的用法

首先要介绍的是open()方法。它接收3个参数:

•要发送的请求的类型(POST、GET等)

•请求的URL

•表示是否异步发送请求的布尔值

调用open()示例:

xhr.open("get", "index.jsp", false);
针对index.jsp的GET请求。URL相对于执行代码的当前页面;调用open()方法并不会真正发送请求,只是启动一个请求以备发送。

调用send()发送请求:

xhr.send(null);

send()接收一个参数,即要作为请求主体发送的数据。如果不需要通过请求主体发送数据,则必须传入null。

相应数据会填充到XHR对象的相关属性:

•responseText:作为响应主体被返回的文本

•responseXML:作为响应的内容类型是“text/xml”或“application/xml”

•status:响应的HTTP状态

•statusText:HTTP状态的说明

在接收响应后,首先检查status属性,确定响应已经返回,一般200作为成功的标志。状态码304表示资源没有修改,可以直接使用浏览器中缓存的版本。

为了接收到合适的响应,应该以如下方式检测两种状态码:

xhr.open("get", "index.jsp", false);
xhr.send(null);
if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
alert(xhr.responseText);
} else {
alert("Request was unsuccessful: " + xhr.status);
}

通过检测readyState属性,可以确定请求/响应过程的当前活动阶段。

•0:未初始化。未调用open()方法

•1:启动。已经调用open()方法,未调用send()方法

•2:发送。已经调用send()方法,未接收到响应

•3:接收。已经接收到部分数据

•4:完成。已经接收到全部数据,可以在客户端使用

readyState属性的值发生变化时,都会触发一次readystatechange事件。在调用open()之前指定onreadystatechange事件处理程序才能确保浏览器兼容性。

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
alert(xhr.responseText);
} else {
alert("请求成功:" + xhr.status);
}
}
};
xhr.open("get", "index.jsp", true);
xhr.send(null);

在接收响应之前,可以取消异步请求:

xhr.abort();

HTTP头部信息

XHR对象提供了操作请求头部和响应头部信息的方法。

默认情况下,在发送XHR请求的同时,还会发送下列头部信息。

•Accept:浏览器能够处理的内容类型

•Accept-Charset:浏览器能够显示的字符集

•Accept-Encoding:浏览器能够处理的压缩编码

•Accept-Language:浏览器当前设置的语言

•Connection:浏览器与服务器之间连接的类型

•Cookie:当前页面设置的任何Cookie

•Host:发出请求的页面所在的域

•Referer:发出请求的页面的URL

•User-Aent:浏览器的用户代理字符串

使用setRequestHeader()可以设置自定义的请求头部信息。必须在调用open()方法之后,且在调用send()之前,调用

setRequestHeader():

xhr.open("get", "index.jsp", true);
xhr.setRequestHeader("MyHeader", "MyValue");
xhr.send(null);

调用getResponseHeader()并传入字段名称,可以取得相应的响应头部信息。getAllResponseHeader()取得包含所有头部信息的长字符串。

var myHeader = xhr.getResponseHeader("MyHeader");
var allHeaders = xhr.getAllResponseHeader();

GET请求

GET用于向服务器查询某些信息。可以将查询字符串参数追加到URL的末尾,查询字符串中的每个参数的名称和值都必须使用encodeURIComponent()编码:

xhr.open("get", "login.jsp?name1=value1&name2=value2", false); 
addURLParam()接收三个参数:要添加参数的URL、参数的名称和参数的值。
var url = "login.jsp";
// 添加参数
url = addURLParam(url, "username", "xxyh");
url = addURLParam(url, "password", "xxyh123");
// 初始化请求
xhr.open("get", url, false);

POST请求

POST请求用于向服务器发送应该被保存的数据。POST请求的主体可以包含非常多的数据,而且格式不限。

初始化请求:

xhr.open("post", "login.jsp", true); 
首先将Content-Type头部信息设置为application/x-www-form-urlencoded,然后建立一个字符串格式。如果需要将页面中的表单数据进行序列化,然后再通过XHR发送到服务器,可以使用serialize()函数来创建这个字符串:
xhr.open("get", "login.jsp", false);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
var form = document.getElementById("user-info");
xhr.send(serialize(form));

以上所述是小编给大家介绍的JavaScript中Ajax的深入理解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
关于document.cookie的使用javascript
Apr 11 Javascript
js 模拟实现类似c#下的hashtable的简单功能代码
Jan 24 Javascript
按给定几率进行随机抽取的js代码
Dec 28 Javascript
JS实现div内部的文字或图片自动循环滚动代码
Apr 19 Javascript
javascript实例--教你实现扑克牌洗牌功能
May 15 Javascript
JavaScript代码复用模式详解
Nov 07 Javascript
比较常见的javascript中定义函数的区别
Nov 09 Javascript
AngularJS中使用HTML5手机摄像头拍照
Feb 22 Javascript
js简单获取表单中单选按钮值的方法
Aug 23 Javascript
关于Vue.js一些问题和思考学习笔记(2)
Dec 02 Javascript
详解Vue中localstorage和sessionstorage的使用
Dec 22 Javascript
Vue watch响应数据实现方法解析
Jul 10 Javascript
AngularJS基础 ng-open 指令简单实例
Aug 02 #Javascript
AngularJS基础 ng-non-bindable 指令详细介绍
Aug 02 #Javascript
实例详解jQuery的无new构建
Aug 02 #Javascript
AngularJS基础 ng-mouseover 指令简单示例
Aug 02 #Javascript
JavaScript比较当前时间是否在指定时间段内的方法
Aug 02 #Javascript
图文详解JavaScript的原型对象及原型链
Aug 02 #Javascript
AngularJS基础 ng-mousemove 指令简单示例
Aug 02 #Javascript
You might like
关于Appserv无法打开localhost问题的解决方法
2009/10/16 PHP
TMDPHP 模板引擎使用教程
2012/03/13 PHP
php实现MySQL数据库备份与还原类实例
2014/12/09 PHP
Yii2超好用的日期和时间组件(值得收藏)
2016/05/05 PHP
原型方法的不同写法居然会影响调试的解决方法
2007/03/08 Javascript
setTimeout 不断吐食CPU的问题分析
2009/04/01 Javascript
JQuery Study Notes 学习笔记(一)
2010/08/04 Javascript
jquery 中多条件选择器,相对选择器,层次选择器的区别
2012/07/03 Javascript
Extjs4 类的定义和扩展实例
2013/06/28 Javascript
JS cookie中文乱码解决方法
2014/01/28 Javascript
jquery插件jquery.beforeafter.js实现左右拖拽分隔条对比图片的方法
2015/08/07 Javascript
基于jQuey实现鼠标滑过变色(整行变色)
2015/12/07 Javascript
浅谈js算法和流程控制
2016/12/29 Javascript
jQuery实现多张图片上传预览(不经过后端处理)
2017/04/29 jQuery
详解 vue.js用法和特性
2017/10/15 Javascript
vue树形结构获取键值的方法示例
2018/06/21 Javascript
layer弹出层父子页面事件相互调用方法
2018/08/17 Javascript
微信小程序开发之自定义tabBar的实现
2018/09/06 Javascript
详解在Javascript中进行面向切面编程
2019/04/28 Javascript
小程序实现横向滑动日历效果
2019/10/21 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
如何手动实现一个 JavaScript 模块执行器
2020/10/16 Javascript
vue实现单一筛选、删除筛选条件
2020/10/26 Javascript
[33:33]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第二场 11.27
2020/11/30 DOTA
Python中的FTP通信模块ftplib的用法整理
2016/07/08 Python
Python开发之Nginx+uWSGI+virtualenv多项目部署教程
2019/05/13 Python
Python进阶:生成器 懒人版本的迭代器详解
2019/06/29 Python
详解pytorch tensor和ndarray转换相关总结
2020/09/03 Python
丹尼尔惠灵顿手表天猫官方旗舰店:Daniel Wellington
2017/08/25 全球购物
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
国税会议欢迎词
2014/01/16 职场文书
关于安全演讲稿
2014/05/09 职场文书
师德师风的心得体会
2014/09/02 职场文书
2014年教师节演讲稿范文
2014/09/10 职场文书
横店影视城导游词
2015/02/06 职场文书
《搭石》教学反思
2016/02/18 职场文书