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集合系列——List集合总结(六)

    一.总结概述 List继承了Collection,是有序的列表. 实现类有ArrayList.LinkedList.Vector.Stack等 ArrayList是基于数组实现的,是一个数组队列.可以 ...

  2. CDH入门

    cloudera(CDH)官网介绍:安装包.离线包该如何下载.官方文档等介绍http://www.aboutyun.com/thread-8908-1-1.html(出处: about云开发) 进入C ...

  3. submit text3的激活与使用

    SublimeText3常用快捷键和优秀插件 SublimeText是前端的一个神器,以其精简和可DIY而让广大fans疯狂.好吧不吹了直入正题 -_-!! 首先是安装,如果你有什么软件管家的话搜一下 ...

  4. pygame_polygon

    今天我们要在窗口上绘制简单的多边形 1.认识几个简单的常用的颜色: black=(0,0,0) while=(255,255,255) red=(255,0,0) green=(0,255,0) bl ...

  5. angular学习-01,使用第三方库(jquery...)

    开发环境(window) 1.安装node  https://nodejs.org/en/ 2.安装angular-cli npm install -g @angular/cli 3.使用ng new ...

  6. 【原创】流程引擎的网关(遵循BPMN2.0)设计总结

    概述 BPMN 2.0是什么呢?业务流程模型注解(Business Process Modeling Notation - BPMN)是 业务流程模型的一种标准图形注解.这个标准 是由对象管理组(Ob ...

  7. Canal 同步异常分析:Could not find first log file name in binary log index file

    文章首发于[博客园-陈树义],点击跳转到原文Canal同步异常分析:Could not find first log file name in binary log index file. 公司搜索相 ...

  8. vue前端页面跳转参数传递及存储

    不同页面间进行参数传递,实现方式有很多种,最简单最直接的方式就是在页面跳转时通过路由传递参数,如下所示. 路由传递参数 this.$router.push({ name: '跳入页面', params ...

  9. 童话故事 --- 通信协议之 HDLC 浅析

    高飞狗: "高飞的白鹭浮水的鹅,唐诗里有画-" 布鲁托: "高飞狗,又在做你的高飞梦哪!" 高飞狗: "哈罗,布鲁托,这几天好郁闷呐!" 布 ...

  10. hibernate中各个jar包的含义和关系

    最基本的Hibernate3.3.2之 JAR包(必要): 包名 位置 用途 hibernate3.jar /hibernate 核心JAR包 antlr.jar /hibernate/lib/req ...