• WEB前端第六十一课——xhr对象POST请求、xhr兼容性、timeout、progress


    1.xhr对象发送post请求

      Ajax中post请求与get请求不同之处在于多了一个表单,而get请求则是通过url发送附加信息。

      在xhr对象中,post请求可以通过FormData构建表单数据。

      语法:var formData = new FormData();

         formData.append('key',value);  //value为字符串时需要使用引号。

         xhr.send(formData);

      说明:formData的创建必须在“xhr.send(formData)”之前!

      示例:

        var userName = document.querySelector('.userName').value;

        var userCode = document.querySelector('.userCode').value;

        var formData = new FormData();  //FormData()为系统内置对象类

        formData.append('uName',userName);

        formData.append('uCode',userCode);

        xhr.send(formData);

      补充:

       ⑴ GET请求的主要特点:

        GET请求可被缓存,请求保留在浏览器历史记录中

        GET请求可被收藏为书签

        GET请求不应在处理敏感数据时使用

        GET请求有长度限制

        GET请求只应当用于取回数据

       ⑵ POST请求的主要特点:

        POST请求不会被缓存,不会保留在浏览器历史记录中

        POST请求不能被收藏为书签

        POST请求对数据长度没有要求

       ⑶ 与POST相比,GET 更简单也更快,并且在大部分情况下都能用。

        然而,在以下情况中,需使用POST请求:

          无法使用缓存文件(更新服务器上的文件或数据库)

          向服务器发送大量数据(POST没有数据量限制)

          发送包含未知字符的用户输入时,POST比GET更稳定也更可靠

        参考资料:w3cschool

    2.xhr对象兼容问题

      xhr对象的获取方式在 IE 和 非IE 环境下需要使用不同的方法。

      语法:

        IE浏览器支持的方法:ActiveXObject('')

        非IE环境支持的方法:XMLHttpRequest()

      因此,在创建 xhr 对象时需要进行判断,示例如下:

        if(window.XMLHttpRequest){

          var xhr = new XMLHttpRequest();

        }else if(window.ActiveObject){

          var xhr = new ActiveXObject('');

        }

      也可以直接使用三目运算进行处理:

        xhr = window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject("");

    3.请求超时

      timeout 属性值等于一个整数,用于设置当请求发出后等待接收响应的时间。

      ontimeout() 方法则是等待超时后,自动执行的回调函数。

      语法:

        xhr.timeout == n;    //时间单位“毫秒”,表示请求发出后响应等待时间。

        xhr.ontimeout = function(){

          console.log('The request for'+url地址+'time out');

        }

      说明:如果在设置的时间内没能收到后台响应内容,则视为请求超时自动执行ontimeout函数。

         如果该属性设置等于 0(默认值),表示没有时间限制!

      代码示例

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>原生Ajax请求</title>
    <!--    <script src="../JScodeFile/jquery-1.8.3.js"></script>-->
    </head>
    <body>
        <label for="userName">登录账户</label>
        <input type="text" id="userName" class="userName">
        <br>
        <label for="userCode">登录密码</label>
        <input type="text" id="userCode" class="userCode">
        <br>
        <button>登录</button>
    <script>
        var uName = document.querySelector('.userName');
        var uCode = document.querySelector('.userCode');
        var btn = document.querySelector('button');
        btn.onclick=function () {
    //      var xhr=new XMLHttpRequest();   //创建对象,准备发送Ajax请求
    
    //      考虑浏览器兼容性问题,创建 xhr 对象时需要进行判断。
            if(window.XMLHttpRequest){
                var xhr = new XMLHttpRequest();
            }else{
                var xhr = new ActiveXObject();
            }
            xhr.onreadystatechange=function () {    //监听后台接收请求状态的变化
                if (xhr.readyState==4){             //判断当前请求进行到何种状态,属性值 4 表示后台已经接收到前台请求
                    if (xhr.status==200){           //判断前台是否准确接收到后台反馈的数据,属性值 200 表示通信成功
                        console.log(xhr.responseText);  //获取后台反馈的完整数据,json串
                        console.log(typeof xhr.responseText);   //返回结果为 string 类型
                        console.log(JSON.parse(xhr.responseText));   //解析返回结果转换为对象
                    }
                }
            }
            xhr.timeout=2000;       //超时设置单位“毫秒”!!
            xhr.ontimeout=function(){
                alert('访问超时,请刷新页面重新加载。')
            }
    //      使用 get 方式发送请求:
            xhr.open('get',"xhr.php?name="+uName.value+"&code="+uCode.value,true);
    //         xhr.open('get',"xhr.php?name="+$('.userName').val()+"&code="+$('.userCode').val(),true);
            xhr.send(null);
    
    //      使用 post 方式发送请求:
    /*        xhr.open('post','xhr.php',true);
            var formD = new FormData();
            formD.append('name',uName.value);
            formD.append('code',uCode.value);
            xhr.send(formD);*/
        }
    </script>
    </body>
    </html>
    
    <?php
    /*    $name1=$_POST['name'];
        $code1=$_POST['code'];*/
        $name1=$_GET['name'];
        $code1=$_GET['code'];
        $res = array('msg'=>'ok','info'=>$_GET);
        $res['userName']=$name1;
        $res['userCode']=$code1;
    //    sleep(3);       //设置服务器睡眠,单位“秒”!!
        echo json_encode($res);
    ?>
    

    4.进度条

      ⑴ progress

        HTML中使用<progress>标签用于定义运行中的任务进度。

        progress属性有:

          max,设置任务完成的值;

          value,设置任务当前进度值。

        注意:<progress>需要与JS配合使用显示任务进度;

          <progress>不能用于表示度量衡,如存储空间使用情况(使用<meter>标签)

      ⑵ progress常用属性

        lengthComputable,返回一个布尔值,表示当前进度是否有可计算长度,

                 默认为true,表示进度没有100%,进度100%时变为false;

        total,返回一个整数,表示当前进度的总长度,

          如果是通过HTTP下载资源,表示内容本身长度,不包含HTTP头部的长度,

          如果lengthComputable属性值为false,则total属性无法取得正确的值。

        loaded,返回一个数值,表示当前进度已经完成的数量,

          该属性值除以total属性值,可以得到目前进度的百分比。

      ⑶ upload

        upload是XMLHttpRequest对象的一个属性,其属性值亦是一个对象,

          该对象定义了addEventListener()方法和整个progress事件集合。

      代码示例:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>进度条</title>
    </head>
    <body>
        <progress max="1" value="0"></progress>
        <input type="file" name="tempFile" class="tempFile" multiple><br>
        <button onclick="fileSubmit()">上传文件</button>
        <script>
            function fileSubmit() {
                var files=document.querySelector('.tempFile').files;
            //  发送文件需要使用POST方式,创建FormData对象。
                var fileData=new FormData();
                for (var i=0,file;file = files[i];i++){
            //  将文件添加到FormData对象中。
                    fileData.append('fileName',file.name);
                }
            //  使用append方法添加到FormData的数据,并不是以对象属性的方式存储,外界无法直接访问到数据
            //  需要使用 for of 方法才能在控制台中打印输出。
                for (var value of fileData.values()){
                    console.log(value);
                    console.log(typeof value);
                }
            //  Ajax请求对象
            //     var xhr=new XMLHttpRequest();    //直接创建
                if (window.XMLHttpRequest){         //兼容性方式创建
                    var xhr=new XMLHttpRequest();
                }else if(window.ActiveXObject){
                    var xhr=new ActiveXObject('');
                }
                // var xhr=window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject('');
            //  监听请求响应通信状态
                xhr.onreadystatechange=function () {
                    if (xhr.readyState==4){
                        if (xhr.status==200){
                            console.log(JSON.parse(xhr.responseText));      //FormData添加文件时,无法直接解析输出!
                        }
                    }
                }
            //  任务进度监听,当上传进度发生改变时,回调函数自动执行
                var progressBar = document.querySelector('progress');
                xhr.upload.onprogress=function(eve){
                    if (eve.lengthComputable){
                        progressBar.value = (eve.loaded/eve.total);
                    }
                }
            //  准备发送请求上传文件
                xhr.open('post','progress.php',true);
                xhr.send(fileData);
            }
        </script>
    </body>
    </html>
    
    <?php
        echo json_encode($_POST['fileName']);
    ?>
    
  • 相关阅读:
    python3 解决tcp黏包方法一
    python3 udp不黏包但丢数据
    python3 类的单例模式
    python3 day07 练习题
    python3 tcp黏包情况二
    python3 tcp黏包情况一
    python3 subprocess模块
    python3 UDP协议下的socket
    python3 TCP协议下的socket
    python3 socket网络通信的整个流程
  • 原文地址:https://www.cnblogs.com/husa/p/14313241.html
Copyright © 2020-2023  润新知