深入理解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 相关文章推荐
基于jquery &amp; json的省市区联动代码
Jun 26 Javascript
jquery div拖动效果示例代码
Dec 08 Javascript
利用jQuery简单实现产品展示图片左右滚动功能(示例代码)
Jan 02 Javascript
javascript实现链接单选效果的方法
May 13 Javascript
jQuery获取上传文件的名称的正则表达式
May 21 Javascript
vue组件中点击按钮后修改输入框的状态实例代码
Apr 14 Javascript
vue 之 .sync 修饰符示例详解
Apr 21 Javascript
原生js封装的ajax方法示例
Aug 02 Javascript
Angular使用cli生成自定义文件、组件的方法
Sep 04 Javascript
微信小程序 image组件遇到的问题
May 28 Javascript
vue通过video.js解决m3u8视频播放格式的方法
Jul 30 Javascript
写给新手同学的vuex快速上手指北小结
Apr 14 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
PHP实现获取并生成数据库字典的方法
2016/05/04 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
浅谈PHP SHA1withRSA加密生成签名及验签
2019/03/18 PHP
laravel使用数据库测试注意事项
2020/04/10 PHP
理解JavaScript中的事件
2006/09/23 Javascript
更正确的asp冒泡排序
2007/05/24 Javascript
自己开发Dojo的建议框架
2008/09/24 Javascript
js 巧妙去除数组中的重复项
2010/01/25 Javascript
js中call与apply的用法小结
2013/12/28 Javascript
javascript中with()方法的语法格式及使用
2014/08/04 Javascript
WEB前端设计师常用工具集锦
2014/12/09 Javascript
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
Javascript实现数组中的元素上下移动
2017/04/28 Javascript
Vue-router 类似Vuex实现组件化开发的示例
2017/09/15 Javascript
使用vue-cli(vue脚手架)快速搭建项目的方法
2018/05/21 Javascript
Vue中 v-if 和v-else-if页面加载出现闪现的问题及解决方法
2018/10/12 Javascript
Electron + vue 打包桌面操作流程详解
2019/06/24 Javascript
electron 如何将任意资源打包的方法步骤
2020/04/16 Javascript
[02:33]2018DOTA2亚洲邀请赛赛前采访——LGD
2018/04/04 DOTA
[47:31]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.12
2020/12/16 DOTA
python回调函数中使用多线程的方法
2017/12/25 Python
Python获取当前函数名称方法实例分享
2018/01/18 Python
Python如何抓取天猫商品详细信息及交易记录
2018/02/23 Python
在Python中居然可以定义两个同名通参数的函数
2019/01/31 Python
python 爬取疫情数据的源码
2020/02/09 Python
Python Tornado批量上传图片并显示功能
2020/03/26 Python
Python实现疫情通定时自动填写功能(附代码)
2020/05/27 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
2020/09/03 Python
马来西亚最大的电器网站:Senheng
2017/10/13 全球购物
技术总监管理职责范本
2014/03/06 职场文书
一帮一活动总结
2014/05/08 职场文书
学校教师读书活动总结
2014/07/08 职场文书
北京爱情故事观后感
2015/06/12 职场文书
mysql知识点整理
2021/04/05 MySQL
详解Django中 render() 函数的使用方法
2021/04/22 Python
python如何读取.mtx文件
2021/04/22 Python