今天学习了原生的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请求的更多相关文章

  1. JavaScript使用浏览器内置XMLHttpRequest对象执行Ajax请求

    所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject).XMLHttpRequest 用于在后台与服务器交换数据.这意味着可以在不重新加载整个 ...

  2. 原生JS发送Ajax请求、JSONP

    一.JS原生Ajax Ajax=异步Javascript+XML: ajax是一种数据请求的方式,不需要刷新整个页面.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. ajax的核心 ...

  3. 解决ajax请求默认不支持重定向问题

    1,Ajax默认是不支持重定向的,只局部刷新数据,不跳转页面. 2,后台代码处理: @RequestMapping("/updateCurrentUser") public Str ...

  4. react中使用Ajax请求(axios,Fetch)

    React本身只关注于界面, 并不包含发送ajax请求的代码,前端应用需要通过ajax请求与后台进行交互(json数据),可以使用集成第三方ajax库(或自己封装) 常用的ajax请求库 jQuery ...

  5. ajax请求后台,response.sendRedirect失效,无法重定向

    今天在写项目的时候,想加一个切换用户,需要清除session并且跳转到登录页面,发起一个ajax请求后,执行完发现无法跳转. 原因在于: (从网上摘录) Ajax只是利用脚本访问对应url获取数据而已 ...

  6. springmvc3 拦截器,过滤ajax请求,判断用户登录,拦截规则设置

    web.xml设置:(/拦截所有请求) <servlet> <servlet-name>dispatcher</servlet-name> <servlet- ...

  7. $.ajax 请求 拦截器 重定向 无效 解决办法

    在ajax 异步请求下 拦截器过滤器中使用 重定向 页面响应无效 我这里用的是springboot框架,用拦截器实现 对请求的拦截 ,session超时直接跳转到login.html页面. 后台代码: ...

  8. XMLHTTPRequest/Ajax请求 和普通请求的区别

    Ajax请求头会多一个x-requested-with参数,值为XMLHttpRequest 详情:http://blog.csdn.net/zhangdaiscott/article/details ...

  9. 配置Chrome启动参数支持本地AJAX请求,解决XMLHttpRequest cannot load file..,Uncaught NetworkError: Failed to execute 'send' on 'XMLHttpRequest':.. 问题

    直接将本地的HTML文件拖拽到Chrome浏览器中运行时,发送的AJAX请求本地文件,会报跨域错误: 报错的原因是:Chrome默认不支持本地的AJAX请求! 解决问题的办法是:给Chrome浏览器添 ...

随机推荐

  1. Quartz使用一 通过getJobDataMap传递数据

    Quartz定时器使用比较广泛,介绍一点简单的使用 上代码:定义一个Job,执行具体的任务 package org.tonny.quartz; import java.text.SimpleDateF ...

  2. sql查询作业执行时间

    SELECT  j.name                        AS Job_Name        ,        h.step_id                     AS S ...

  3. COGS 2111. [NOIP2015普及]扫雷游戏

    ★   输入文件:2015mine.in   输出文件:2015mine.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 扫雷游戏是一款十分经典的单机小游戏.在 n 行 ...

  4. Oracle数据库升级前必要的准备工作

    Oracle数据库升级向来是一门纷繁复杂的工程,DBA需要为产品数据库的升级耗费大量时间精力在准备工作上:因为其升级复杂度高,所以即便做了较为充分的准备仍可能在升级过程中遇到意想不到的问题,为了更高效 ...

  5. Android(java)学习笔记161:开发一个多界面的应用程序之人品计算器的简单实现

    1.开启新的Activity的方法: (1)Intent 意图 (2)intent.setAction("自定义")  记得在清单文件中声明 (3)intent.setData(前 ...

  6. js中重载问题

    在js中是没有重载的  但是  Arguments对象(可以实现模拟重载的效果) 利用arguments对象的length属性,可以获取函数接收的参数的个数 例如: function add(){ i ...

  7. Ubuntu的防火墙配置-ufw-iptables

    自打2.4版本以后的Linux内核中, 提供了一个非常优秀的防火墙工具.这个工具可以对出入服务的网络数据进行分割.过滤.转发等等细微的控制,进而实现诸如防火墙.NAT等功能.一般来说, 我们会使用名气 ...

  8. JavaEE-05 分页与文件上传

    学习要点 新闻分页显示数据 新闻图片上传 JSP分页显示数据 分页 数据信息较多的的时候一般采用列表显示,方便展示信息: 数据量较大的时候一般采用列表加分页的方式显示,便于阅读. 分页方式:集合或者s ...

  9. MySQL-03 SQL语句设计

    学习要点 SQL语句分类 DML语句 DML 查询语句 SQL语句分类 数据操纵语言(DML):用来操纵数据库中数据的命令.包括:SELECT.INSERT.UPDATE.DELETE. 数据定义语言 ...

  10. visual studio中使用vim快捷键

    vsvim下载链接: https://marketplace.visualstudio.com/items?itemName=JaredParMSFT.VsVim 下载,关闭visual studio ...