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即可) 一.总 ...
随机推荐
- 【Linux笔记(002) 】-- centos7 文档操作基本命令
一.cd -- ChangeDirectory a) 切换到 /DemoLM/ 文件夹 b) 回到用户 Home 根目录:是哪个账户登录的就会进入哪个用户的根目录 二.pwd -- PrintWork ...
- Undefined symbols for architecture arm64: "_OBJC_CLASS_$_WKWebView", referenced from: objc-c
出现: Undefined symbols for architecture arm64: "_OBJC_CLASS_$_WKWebView", referenced from: ...
- struts2的防止表单重复提交
防止表单重复提交其实就是struts2的一个拦截器的使用: struts.xml配置文件: <?xml version="1.0" encoding="UTF-8& ...
- ubuntu环境配置eclipse+opencv
blockquote { direction: ltr; color: rgb(0, 0, 0) } blockquote.western { font-family: "Liberatio ...
- SQL server学习(三)T-SQL编程、逻辑控制语句和安全模式
T-SQL编程 T-SQL编程与C语言类似,只是语法稍有不同而已,总体思想还是没有变化的.多的就不说了,还是从变量开始. 变量也分为全局变量和局部变量,表示方式稍有不同. 局部变量: 局部变量必须以标 ...
- JavaWeb(五)之JSTL标签库
前言 前面介绍了EL表达式,其实EL表达式基本上是和JSTL核心标签库搭配一起使用才能发挥效果的.接下来让我们一起来认识一下吧! 在之前我们学过在JSP页面上为了不使用脚本,所以我们有了JSP内置的行 ...
- jvm系列(十):如何优化Java GC「译」
本文由CrowHawk翻译,是Java GC调优的经典佳作. 本文翻译自Sangmin Lee发表在Cubrid上的"Become a Java GC Expert"系列文章的第三 ...
- Django安装Xadmin步骤
在Django中安装Xadmin替换原始的admin,下面介绍两种方法安装 第一种方法:pip安装 第一步: 直接pip安装xadmin pip install xadmin pip会同时安装上面三个 ...
- 转载:WPF MVVM之INotifyPropertyChanged接口的几种实现方式
原文地址:http://www.cnblogs.com/xiwang/ 序言 借助WPF/Sliverlight强大的数据绑定功能,可以比实现比MFC,WinForm更加优雅轻松的数据绑定.但是在使用 ...
- 反射型 DDoS 攻击的原理和防范措施
随着僵尸网络的兴起,同时由于攻击方法简单.影响较大.难以追查等特点,分布式拒绝服务攻击(DDoS,Distributed Denial of Service)得到快速壮大和日益泛滥. 成千上万主机组成 ...