通过XMLHttpRequest,ActiveXObject实现ajax请求
今天学习了原生的ajax请求。我将涉及到的ajax请求方法封装成了一个对象:
var xhr={
getXHR:function(){
var XHR = null;
if(typeof window.ActiveXObject != 'undefined'){
XHR = xhr.createActiveXObject();
}else{
XHR = xhr.createStandardXHR();
}
return XHR;
},
createActiveXObject:function(){
try{
return new window.ActiveXObject("Mscrosoft.XMLHttp");
}catch(e){}
},
createStandardXHR:function(){
try{
return new window.XMLHttpRequest();
}catch(e){}
}, onreadystatechange:function(xhr,callback){
if(!callback){return;}
if(xhr.readyState == 4){
if((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
callback(xhr.responseText);
}
}
},
//IE8+
ontimeout:function(callback){
if(!callback){return;}
callback();
},
onprogress:function(event,callback){
console.log("dsss");
if(!callback){return;}
callback(event);
}
};
发送一个请求:
var XHR = xhr.getXHR();
XHR.onreadystatechange=xhr.onreadystatechange(function(data){
console.log(data);
}); XHR.timeout=10000; XHR.ontimeout = xhr.ontimeout(function(){
alert("timeout");
}); XHR.onprogress = xhr.onprogress(function(event){
console.log(event.totalSize);
}); XHR.open("get","url",true);
XHR.send(null);
open方法接收三个参数,请求类型,请求url,是否是异步。
当为异步请求时,XHR的readystate属性有以下属性值:
当为0时,即表示没有调用open()方法;
当为1时,此时已经调用了open()方法;
当为2时,此时已经调用了send()方法;
当为3时,此时已经有部门的数据相应了;
当为4时,此时数据已经全部相应,而且可以在客户端使用了;
每次readyState的值改变,都会触发一次onreadystatechange事件,因此要在调用open()之前指定onreadystatechange事件以便判断是否已经响应完成且可以使用数据了。
对onreadystatechange事件的处理程序为:
onreadystatechange:function(xhr,callback){
if(!callback){return;}
if(xhr.readyState == 4){
if((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
callback(xhr.responseText);
}
}
},
首选检测是否已经接收了全部响应数据,因此需要判断xhr.readyState的值是否为4;
当响应完成后,响应结果存在多种,有的是500失败了,有的是404未找到等等。因此需要根据返回的状态status的值来判断响应是否成功。当status为304时,表示的是该资源缓存了,直接取的缓存数据。
XHR.send(null) :发送请求,当没有参数传递时,参数为null;当为get请求时,携带的参数需要通过encodeURIComponent进行编码。
也可以自定义请求的头部信息,在send()与open()方法之间进行设置:
XHR.sendRequestHeader(key,value);
通过XMLHttpRequest,ActiveXObject实现ajax请求的更多相关文章
- JavaScript使用浏览器内置XMLHttpRequest对象执行Ajax请求
所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject).XMLHttpRequest 用于在后台与服务器交换数据.这意味着可以在不重新加载整个 ...
- 原生JS发送Ajax请求、JSONP
一.JS原生Ajax Ajax=异步Javascript+XML: ajax是一种数据请求的方式,不需要刷新整个页面.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. ajax的核心 ...
- 解决ajax请求默认不支持重定向问题
1,Ajax默认是不支持重定向的,只局部刷新数据,不跳转页面. 2,后台代码处理: @RequestMapping("/updateCurrentUser") public Str ...
- react中使用Ajax请求(axios,Fetch)
React本身只关注于界面, 并不包含发送ajax请求的代码,前端应用需要通过ajax请求与后台进行交互(json数据),可以使用集成第三方ajax库(或自己封装) 常用的ajax请求库 jQuery ...
- ajax请求后台,response.sendRedirect失效,无法重定向
今天在写项目的时候,想加一个切换用户,需要清除session并且跳转到登录页面,发起一个ajax请求后,执行完发现无法跳转. 原因在于: (从网上摘录) Ajax只是利用脚本访问对应url获取数据而已 ...
- springmvc3 拦截器,过滤ajax请求,判断用户登录,拦截规则设置
web.xml设置:(/拦截所有请求) <servlet> <servlet-name>dispatcher</servlet-name> <servlet- ...
- $.ajax 请求 拦截器 重定向 无效 解决办法
在ajax 异步请求下 拦截器过滤器中使用 重定向 页面响应无效 我这里用的是springboot框架,用拦截器实现 对请求的拦截 ,session超时直接跳转到login.html页面. 后台代码: ...
- XMLHTTPRequest/Ajax请求 和普通请求的区别
Ajax请求头会多一个x-requested-with参数,值为XMLHttpRequest 详情:http://blog.csdn.net/zhangdaiscott/article/details ...
- 配置Chrome启动参数支持本地AJAX请求,解决XMLHttpRequest cannot load file..,Uncaught NetworkError: Failed to execute 'send' on 'XMLHttpRequest':.. 问题
直接将本地的HTML文件拖拽到Chrome浏览器中运行时,发送的AJAX请求本地文件,会报跨域错误: 报错的原因是:Chrome默认不支持本地的AJAX请求! 解决问题的办法是:给Chrome浏览器添 ...
随机推荐
- Java练习题02
问题: 编程求一个整数数组的最大值.最小值.平均值和所有元素的和. 代码: public class Page99{ public static void main(String args[] ...
- RFS自动化测试(一)
RFS 即 Robot Framework + Selenium RFS 的安装 1. python https://www.python.org/ RF框架是基于python的,所以要先安装有pyt ...
- 配置nginx+tomcat支持websocket
问题情景: 最近开发新增加一个项目,需要支持https wss协议 访问https://test.aa.com 使用nginx反向代理到后端tomcat web应用 访问https://tes ...
- 关于js中的then(盗)
then()相关的东西包括但不限于:promise,thien.js 虽然还没彻底搞清楚这些个玩意儿,但是 现在知道了 then()是干嘛的了 最主要的,是解决了异步方法立刻返回的问题 这个特性 ...
- 第4节 hive调优:动态分区调整问题
执行如下截图中的语句时卡住了: 原因:yarn未启动,hive底层是要提交mapreduce到yarn上才能计算结果的. 之前启动yarn时,未执行jps查看是否已经启动.其实未启动成功: [root ...
- mongodb windows 开机启动
1)新建存放db E:\mongodb\data\db 2)新建日志文件 E:\mongodb\logs\log.txt 3)管理员运行Cmd 4)CD mongodb安装路径 5)运行命令 mong ...
- Redis进阶例子
工作中用到的RabbitMQ例子 , 但是最后没有用 , 用的CMQ , 顺便说下CMQ社区真的少 , 并且功能少 . 一.消息体 package com.bootdo.common.rabbitmq ...
- 浅谈Link-Cut Tree(LCT)
0XFF 前言&概念 Link-Cut Tree 是一种用来维护动态森林连通性的数据结构,适用于动态树问题.它采用类似树链剖分的轻重边路径剖分,把树边分为实边和虚边,并用 Splay 来维护每 ...
- C语言int *a 和int* a的写法
- python的2种字符串格式化输出
字符串格式化代码(typecode) 法一: %格式使用下面的格式 %[(name)] [flags] [width][.precision] typecode (name)输出字典的value使用, ...