function createXHR() {

if (typeof XMLHttpRequest != “undefi ned”){
     return new XMLHttpRequest();
} else if (typeof ActiveXObject != “undefined”){                                                                                        ie6及以下只能使用activeX 对象,没有XMLHttpRequest

if (typeof arguments.callee.activeXString != “string”){

var versions = [“MSXML2.XMLHttp.6.0”, “MSXML2.XMLHttp.3.0”, “MSXML2.XMLHttp”], i, len;

 

for (i=0,len=versions.length; i < len; i++){

try {

new ActiveXObject(versions[i]);

arguments.callee.activeXString = versions[i];

break;

} catch (ex){

//有错误就跳过

}

}

}

return new ActiveXObject(arguments.callee.activeXString);
} else {
     throw new Error(“No XHR object available.”);
}

}
var xhr = createXHR();
xhr.open(“get”, “example.php”, false);                                 这里的URL是相对于调用该代码的页面地址,调用open方法并没有发送请求,只是准备好一个要发送的请求
xhr.send(null);                                      该方法必须接受一个参数,作为发送给服务器的请求数据,如果没有数据需要发送给服务器,那么填null,不填有些浏览器会报错

 

当接收到服务器的响应之后,该XHR对象的属性就会带着数据回来啦,相关属性有:
responseText  — 返回的text就是响应的主体内容了
responseXML  —  如果响应有内容类型 “text/xml”or “application/xml”,则包含一个带有响应数据的XML Dom文档 
status   —   相应的HTTP状态
statusText  — HTTP状态的描述

 

判断响应状态,通常20几代表成功了部分数据已经返回,另外304表示那个资源没有被修改过,直接从浏览器缓存拿过来就可以
if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {   
    alert(xhr.responseText);
} else {
    alert(“Request was unsuccessful: “ + xhr.status);
}
(浏览器兼容问题:Several browsers incorrectly report a 204 status code. ActiveX versions of XHR in Internet Explorer set statusto 1223 when a 204 is retrieved, and native XHR objects in Internet Explorer normalize 204 to 200. Opera reports a statusof 0 when a 204 is retrieved.)

 

当异步发送的时候,xhr对象有一个readystate可以指示出目前处于(请求/响应)循环的那个阶段
0  ---   请求未初始化
1  ---   服务器连接已建立
2  ---  请求已接收
3  ---  请求处理中
4  ---  请求已完成,且响应已就绪

 

当状态从一个进入另一个的时候,都会触发readystatechange事件,因此可以在此添加事件来检查:
var xhr = createXHR();
xhr.onreadystatechange = function() {                                                 //这个事件不会有event 对象,使用this因为scope作用域问题可能导致函数运行失败或者报错

if (xhr.readyState == 4){

if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {

alert(xhr.responseText);

} else {

alert(“Request was unsuccessful: “ + xhr.status);

}

}

};
xhr.open(“get”, “example.txt”, true);
xhr.send(null);

 

在收到响应之前可以调用abort()来终止异步请求:
xhr.abort();
调用这个方法xhr对象就停止触发事件,阻止接入xhr上任何和响应数据相关的属性

 

HTTP  Headers
每一个请求和响应都伴随着一系列的header信息,xhr对象有一系列操作的方法

 

xhr请求发送的时候默认会带有的header(因浏览器而异,以下的是大部分浏览器都会发送的):
Accept  —  这个浏览器能够处理的内容类型
Accept-Charset  — 当前浏览器可以显示的字符集
Accept-Encoding  — The compression encodings handled by the browser.
Accept-Language  — 浏览器当前语言环境(中英文之类的)
Connection  — 当前浏览器和服务器之间的连接类型
Cookie  — Any cookies set on the page.
Host  — The domain of the page making the request.
Referer  — The URI of the page making the request. Note that this header is spelled incorrectly in the HTTP specification and so must be spelled incorrectly for compatibility purposes. (The correct spelling of this word is “referrer”.)
User-Agent  — The browser’s user-agent string

 

使用setRequestHeader()添加额外的header,注意使用的时候要在open之后,send之前:
...
xhr.open(“get”, “example.php”, true);
xhr.setRequestHeader(“MyHeader”, “MyValue”);
xhr.send(null);
...
不建议使用默认的header名字来发送信息(如:不要啊 xhr.setRequestHeader(“Accept”, “MyValue”);)  而且有些浏览器不允许覆盖

 

从xhr获取服务器响应的header信息:
var myHeader = xhr.getResponseHeader(“MyHeader”);
var allHeaders xhr.getAllResponseHeaders();

 

GET 请求(通常用来请求数据):
所有的键值对的名称和值都要先encodeURIComponent()编码,然后使用等号连接 ,下面这个函数就是添加参数到URL:
function addURLParam(url, name, value) {

url += (url.indexOf(“?”) == -1 ? “?” : “&”);
url += encodeURIComponent(name) + “=” + encodeURIComponent(value);
return url;

}

 

POST 请求(通常用来发送需要被存储的数据)
post请求的主体可以容纳大量数据,任何格式,通常发起的post请求不会被服务器当做表格提交来处理,直接读取未经处理的数据,但是可以模拟:
function submitData(){

var xhr = createXHR();
xhr.onreadystatechange = function(){
if (xhr.readyState == 4){
if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
alert(xhr.responseText);
} else {
alert(“Request was unsuccessful: “ + xhr.status);
}
}
};
xhr.open(“post”, “postexample.php”, true);
xhr.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”);         //模拟表单提交时的内容类型
var form = document.getElementById(“user-info”);
xhr.send(serialize(form));

}
post请求开销会更多,发送同样的数据get比post快将近两倍

Ajax comet XMLHttpRequest 异步的更多相关文章

  1. ajax的xmlHttpRequest异步请求和Springmvc的sendRedirect失效问题

    参考: Ext 提交表单用的异步提交Ajax.Ajax在发送请求时后台返回的数据(json或者html页面)在其回调函数中处理.  你这个相当于后台把Center_right.jsp页面已经返回给前台 ...

  2. js系列教程11-json、ajax(XMLHttpRequest)、comet、SSE、WebSocket全解

    js系列教程11-json.ajax(XMLHttpRequest).comet.SSE.WebSocket全解:https://blog.csdn.net/luanpeng825485697/art ...

  3. AJAX初探,XMLHttpRequest介绍

    AJAX初探,XMLHttpRequest介绍 AJAX      AJAX = Asynchronous JavaScript and XML. 异步的JavaScript和XML.      AJ ...

  4. Ajax与ashx异步请求的简单案例

    Ajax与ashx异步请求的简单案例: 前台页面(aspx): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//E ...

  5. 使用AJAX技术发送异步请求,HTTP服务端推送

    使用AJAX技术发送异步请求 什么是AJAX AJAX指一步Javascript和XML(Asynchronous JavaScript And XML),它是一些列技术的组合,简单来说AJAX基于X ...

  6. asp.net——Ajax与ashx异步请求的简单案例

    Ajax与ashx异步请求的简单案例: 前台页面(aspx): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//E ...

  7. Ajax的XMLHttpRequest对象

    编写一个例子:从服务器取回一个Hello Ajax字符串. HTML: <input type="button" value="ajax提交" oncli ...

  8. 原生ajax、XMLHttpRequest和FetchAPI简单描述

    什么是ajax ajax的出现,刚好解决了传统方法的缺陷.AJAX 是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个 ...

  9. js进阶ajax的XMLHttpRequest对象的status和statustext属性(如果ajax和php联合使用的话:open连接服务器的第二个参数文件路径改成请求php的url即可)

    js进阶ajax的XMLHttpRequest对象的status和statustext属性(如果ajax和php联合使用的话:open连接服务器的第二个参数文件路径改成请求php的url即可) 一.总 ...

随机推荐

  1. Java Byte取值范围

    Java Byte 的取值范围大家都知道(-128 ~ 127),那么-128 和 127 这两个数是怎么计算的呢? #大学知识回顾: 概念:负数的补码是该 数 绝 对 值 的 原 码 按 位 取 反 ...

  2. pdf去水印

    问: 我用Adobe acrobat professional 7.0 版想去掉添加的水印,不知道如何删除,请各位大 侠指点! 答:1.(功能表)工具→高级编辑工具→TouchUp对象工具 2.用滑鼠 ...

  3. 基于Quartz实现简单的定时发送邮件

    一.什么是Quartz Quartz 是一个轻量级任务调度框架,只需要做些简单的配置就可以使用:它可以支持持久化的任务存储,即使是任务中断或服务重启后,仍可以继续运行.Quartz既可以做为独立的应用 ...

  4. python对列表的联想

    python的列表与字典,已经接触无数次了.但是很多用法都记不住,个人觉得归根原因都是只是学了知识点而少用,也少思考.在此试图用宫殿记忆法对它们的用法做个简单的梳理. 首先,说说列表的删除,删除有三种 ...

  5. 57、Bootstrap中文文档

    给大家介绍一个前端框架让你从此写起前端代码与之先前相比如有神助般的效果拉就是Bootstrap. 一.Bootstrap的下载 Bootstrap,由Twitter的设计师Mark Otto和Jaco ...

  6. FPGA与安防领域

    安防主要包括:闭路监控系统.防盗报警系统.楼宇对讲系统.停车厂管理系统.小区一卡通系统.红外周界报警系统.电子围栏.巡更系统.考勤门禁系统.安防机房系统.电子考场系统.智能门锁等等. 在监控系统中,F ...

  7. 一道javascript面试题(闭包与函数柯里化)

    要求写一个函数add(),分别实现能如下效果: (1)console.log(add(1)(2)(3)(4)()); (2)console.log(add(1,2)(3,4)()); (3)conso ...

  8. Spring读书笔记——bean解析

    前情回顾 上篇<Spring读书笔记--bean加载>我们从代码角度介绍了有哪些类负责解析XML文件,又是如何一步步从XML格式脱变成我们熟悉的bean的,直到DefaultBeanDef ...

  9. java.security.InvalidKeyException: Illegal key size

    今天遇到一个奇怪的问题. 自己做的加签验签功能已经没有问题了,本地测试通过,同事放到服务器上测试也没问题. 然后我将包放到自己搭建的环境上,会报这样一个错误: java.security.Invali ...

  10. Yarn一点小认识

    正文 打开官网http://hadoop.apache.org/docs/r2.6.5/hadoop-yarn/hadoop-yarn-site/YARN.html,将图片拿过来. 我用的是2.6.5 ...