XMLHttpRequest 整理

看了SF 上的一篇文章感触颇深:你真的会使用XMLHttpRequest吗?

在这我写上我读后的笔记:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>XMLHttpRequest测试</title>
</head>
<body>
    <progress id="uploadprogress" value="0" min="0" max="100">0</progress>
    
    <script type="text/javascript">
        //构造表单数据
        var formData = new FormData();
        formData.append('username','tom');
        //创建XHR对象
        var xhr=new XMLHttpRequest();
        //设置xhr过期时间
        xhr.timeout = 3000;

        //手动设置了中content-type
        //xhr.setRequestHeader();

        //设置响应返回数据格式
        xhr.responseType="json";
        //创建一个post 异步请求
        xhr.open("post",'./server.php',true);

        /**
         *
         * 匿名函数参数e为progressEvent 进度事件
         *
        **/
        //注册相关事件回调处理函数
        xhr.onload = function(e){
            if(this.status==200 || this.status==304){
                //alert(this.responseText);
                console.log(this.response);
                //console.log(e);
            }
        }
        //当请求结束(包括请求成功和请求失败)时触发
        xhr.onloadend =function(e){
            console.log("触发onloadend 请求结束");
        }    
        //调用xhr.send()方法后立即触发,若xhr.send()未被调用则不会触发此事件。
        xhr.onloadstart=function(e){
            console.log("触发onloadstart 发送时立刻触发");
        }
        //获取xml错误事件 
        xhr.ontimeout= function(e){
            alert("超时!");
            console.log(e);
        }
        //获取xml错误事件
        xhr.onerror=function(e){
            alert("服务器发生错误!");
            console.log(e);
        }
        //获取xml进度事件
        xhr.onprogress = function(e) {
            if (e.lengthComputable) {
          var complete = (e.loaded / e.total * 100 | 0);
          var progress = document.getElementById('uploadprogress');
          progress.value = progress.innerHTML = complete;
          }
        };

        xhr.onabort=function(e){
            console.log("你取消了这个ajax请求");
        }
        //每当当前状态变化时触发
        xhr.onreadystatechange = function () {
            //获取xmr请求当前的状态
            switch(xhr.readyState){
              case 0://初始状态,未打开
                  console.log("此时xhr对象被成功构造,open()方法还未被调用")
                break;
              case 1://OPENED
                console.log("open()方法已被成功调用,send()方法还未被调用");
                    break;
              case 2://HEADERS_RECEIVED 已获取响应头
                  //abort()取消这个请求
                  //xhr.abort();
                console.log("send()方法已经被调用, 响应头和响应状态已经返回")
                break;
              case 3://LOADING 正在下载响应体
                console.log("响应体(response entity body)正在下载中,此状态下通过xhr.response可能已经有了响应数据")
                break;
              case 4://DONE 响应结束
                console.log("整个数据传输过程结束,不管本次请求是成功还是失败")
                break;
            }
        }

        try{
        //在请求时 如果发生错误 需要捕获否则无法执行下面的代码
            xhr.send(formData);
        }catch(e) {        
            console.log(e);
        };
          

        //console.log(formData);
        //console.log(xhr);
    </script>
</body>
</html>
原文地址:https://www.cnblogs.com/zjhblogs/p/6479718.html