Ajax comet XMLHttpRequest 异步
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 异步的更多相关文章
- ajax的xmlHttpRequest异步请求和Springmvc的sendRedirect失效问题
参考: Ext 提交表单用的异步提交Ajax.Ajax在发送请求时后台返回的数据(json或者html页面)在其回调函数中处理. 你这个相当于后台把Center_right.jsp页面已经返回给前台 ...
- js系列教程11-json、ajax(XMLHttpRequest)、comet、SSE、WebSocket全解
js系列教程11-json.ajax(XMLHttpRequest).comet.SSE.WebSocket全解:https://blog.csdn.net/luanpeng825485697/art ...
- AJAX初探,XMLHttpRequest介绍
AJAX初探,XMLHttpRequest介绍 AJAX AJAX = Asynchronous JavaScript and XML. 异步的JavaScript和XML. AJ ...
- Ajax与ashx异步请求的简单案例
Ajax与ashx异步请求的简单案例: 前台页面(aspx): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//E ...
- 使用AJAX技术发送异步请求,HTTP服务端推送
使用AJAX技术发送异步请求 什么是AJAX AJAX指一步Javascript和XML(Asynchronous JavaScript And XML),它是一些列技术的组合,简单来说AJAX基于X ...
- asp.net——Ajax与ashx异步请求的简单案例
Ajax与ashx异步请求的简单案例: 前台页面(aspx): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//E ...
- Ajax的XMLHttpRequest对象
编写一个例子:从服务器取回一个Hello Ajax字符串. HTML: <input type="button" value="ajax提交" oncli ...
- 原生ajax、XMLHttpRequest和FetchAPI简单描述
什么是ajax ajax的出现,刚好解决了传统方法的缺陷.AJAX 是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个 ...
- js进阶ajax的XMLHttpRequest对象的status和statustext属性(如果ajax和php联合使用的话:open连接服务器的第二个参数文件路径改成请求php的url即可)
js进阶ajax的XMLHttpRequest对象的status和statustext属性(如果ajax和php联合使用的话:open连接服务器的第二个参数文件路径改成请求php的url即可) 一.总 ...
随机推荐
- 大数据 - Teradata学习体会
引言 随着计算机系统在处理能力.存储能力等方面,特别是计算机软件技术的不断提高,使得信息处理技术得到飞速发展. 数据处理主要分为两大类:联机事物处理OLTP.联机分析处理OLAP.OLTP也就是传统的 ...
- AFN默认请求和响应的处理
1.默认的响应的解析 1.1 AFN默认不支持接受text/html数据类型,只需要增加即可 manager.responseSerializer.acceptableCont ...
- Laravel5 控制器
Request 一.取值 1.取值 echo $request->input('name','这是默认值'); 2.取得所有值 $array=$request->all(); 3.判断值是 ...
- hdu1116有向图判断欧拉通路判断
Play on Words Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- sql sever 基础知识及详细笔记
第六章:程序数据集散地:数据库 6.1:当今最常用的数据库 sql server:是微软公司的产品 oracle:是甲骨文公司的产品 DB2:数据核心又称DB2通用服务器 Mysql:是一种开发源代 ...
- mac idea sbt工程打jar包
1.首先保证sbt已下载,否则下载homebrew:在命令行输入/usr/bin/ruby XXX ->下载完成后在终端输入brew install sbt ->安装完毕后可以打jar包 ...
- PHP-FPM进程池探秘
PHP 支持多进程而不支持多线程:PHP-FPM 在进程池中运行多个子进程并发处理所有连接请求.通过 ps 查看PHP-FPM进程池(pm.start_servers = 2)状态如下: root@d ...
- PHP之回调函数传参(解决eval函数拼接对象参数的问题)
在使用Smarty时,定义了一个统一调用控制器的函数,如下: function C($name, $method){//控制器的名称和其中方法的名称 require_once "contro ...
- LINUX 笔记-wc命令
命令参数: -c 统计字节数. -l 统计行数. -m 统计字符数.这个标志不能与 -c 标志一起使用. -w 统计字数.一个字被定义为由空白.跳格或换行字符分隔的字符串.
- [ACdream] 女神教你字符串——三个气球
Problem Description 女神邀请众ACdream开联欢会,显然作为ACM的佼佼者,气球是不能少的~.女神准备了三种颜色的气球,红色,黄色,绿色(交通信号灯?) 有气球还不能满足女神,女 ...