zoukankan      html  css  js  c++  java
  • js之AJAX

    AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。
    AJAX 不是新的编程语言,而是一种使用现有标准的新方法。
    AJAX 是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下。
    AJAX的核心是JavaScript对象XmlHttpRequest。
    由于ie7-XmlHttpRequest是通过ActiveXObject实现的,所以特殊处理才能兼容

    function createXHR() {
        if (typeof XMLHttpRequest != "undefined") {
            return new XMLHttpRequest();
        } else if (typeof ActiveXObject != "undefined") {
            var version = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp"];
            var i;
            var len = version.length;
    
            for (i = 0; i < len; i++) {
                try {
                    return new ActiveXObject(version[i]);
                    break;
                } catch(e) {
                }
            }
        }
        return new Error("此浏览器不支持Ajax");
    }

    1 同步请求

    //1 先创建xhr对象
    var xhr = createXHR();
    
    //2 调用open方法,分别传入请求类型,url,是否异步
    //由于ie的get请求会被缓存,所以需要传个随机参数,防止缓存
    //请求的参数名和参数值最好使用encodeURIComponent进行编码处理
    xhr.open("get", "test.ashx?_r=" + Math.random(), false);
    
    //3 发送请求
    //如果是get请求,则send方法为null,如果是post,则参数写在这里
    xhr.send(null);
    
    //通过判断xhr的状态处理,对请求回来的数据进行处理
    //ie低版本会把204设置为1223,高版本会把204变成200,opera会把204设置为0,204的响应中没有body,而且Content-Length=0。
    if((xhr.status >= 200 && xhr.status < 300)||xhr.status === 304 || xhr.status === 1223 || xhr.status === 0) {
        //由于xhr.responseXML只有在返回xml才有效,所以一般使用xhr.responseText
        alert(xhr.responseText);
    }
    //一般情况下xhr对象不进行重用
    xhr = null;

    2 异步请求

    //1 先创建xhr对象
    var xhr = createXHR();
    
    //2 由于异步请求会在整个请求阶段都触发onreadystatechange,所以在这个事件里对结果进行处理
    //  跟其他事件不同,onreadystatechange不会传入event对象
    xhr.onreadystatechange = function () {
        //这里使用xhr,而不是this,有资料说使用this会在某些浏览器上报错(但我没遇到过)
        //readState为4表示请求结束
        if (xhr.readyState == 4) {
            if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304 || xhr.status === 1223 || xhr.status === 0) {
                alert(xhr.responseText);
            }
        }
    };
    
    //3 调用open方法,由于post请求不会缓存,所以不需要随机参数来防止缓存
    xhr.open("post", "test.ashx", true);
    
    //4 设置请求头部,post请求需要模拟表单提交,服务器才能得到请求过来的参数
    //  这一步必须在open和send中间
    
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    
    //5 发送请求
    //请求的参数名和参数值最好使用encodeURIComponent进行编码处理
    xhr.send("name=mu&age=27");

    注意:
    1 get请求处理的速度比post快,如果数据量不大建议优先get请求
    2 xhr.abort()可以中断请求,必须放在send后面
    3 xhr中的请求头信息只能设置,回复头信息只能读取

  • 相关阅读:
    java中执行子类的构造方法时,会不会先执行父类的构造方法
    Failed to start component [StandardEngine[Catalina].
    AlertDialog的onCreateDialog与onPrepareDialog用法
    [华为机试练习题]25.圆桌游戏
    HDU 5071 模拟
    把手机变成电脑的遥控器
    查询锁表的信息
    Testin云測与ARM 战略合作:推动全球移动应用加速进入中国市场
    9 abstract 和 Virtual 之间的差别
    STL之vector容器的实现框架
  • 原文地址:https://www.cnblogs.com/mu-mu/p/3394638.html
Copyright © 2011-2022 走看看