zoukankan      html  css  js  c++  java
  • xmlhttprequest


    title: XMLHttpRequest
    date: 2017-08-18 11:00:38
    tags: XMLHttpRequest

    ajax的真面目

    ajax一直在使用,使用起来相对简单,之前也看过其本质。但是久之就遗忘了。故记录下来

    jquery 的简便使用方法
        $.ajax({
            url: 'http://xxxx.xxx.xxx',//请求的url
            type: 'GET',//请求类型
            data:{//请求参数
                key1:value1
                key2:value2
            },
            success:function(res){//成功回调
    
            },
            error:function(res){//失败回调
    
            }
        })
    

    何为ajax

    AJAX stands for Asynchronous JavaScript and XML. AJAX is a new technique for creating better, faster, and more interactive web applications with the help of XML, HTML, CSS, and Java Script。翻译过来就是AJAX代表异步JavaScript和XML。 AJAX是在XML,HTML,CSS和Java脚本的帮助下创建更好,更快,更具交互性的Web应用程序的新技术。总结就是我们使用XMLHttpRequest对象来发送一个Ajax请求

    XMLHttpRequest1

    包含:
    • xhr.readyState:XMLHttpRequest对象的状态,等于4表示数据已经接收完毕。
    • xhr.status:服务器返回的状态码,等于200表示一切正常。
    • xhr.responseText:服务器返回的文本数据
    • xhr.responseXML:服务器返回的XML格式的数据
    • xhr.statusText:服务器返回的状态文本。
    缺点:
    • 只支持文本数据的传送,无法用来读取和上传二进制文件。
    • 传送和接收数据时,没有进度信息,只能提示有没有完成。
    • 受到"同域限制"(Same Origin Policy),只能向同一域名的服务器请求数据。
    var xhr = new XMLHttpRequest();
    xhr.open('GET','http://xxx.xxx.xx');
    xhr.send();
    xhr.onreadystatechange = function(){
        if ( xhr.readyState == 4 && xhr.status == 200 ) {
            //请求成功
            alert( xhr.responseText );
        } else {
            alert( xhr.statusText );
        }
    }
    

    XMLHttpRequest2

    增加:
    • 可以设置HTTP请求的时限。
    • 可以使用FormData对象管理表单数据。
    • 可以上传文件。
    • 可以请求不同域名下的数据(跨域请求)。
    • 可以获取服务器端的二进制数据。
    • 可以获得数据传输的进度信息。
    1.增加timeout功能
    xhr.timeout = 3000;
    xhr.ontimeout = function(event){
        alert('请求超时!');
    }
    
    2.模拟表单
    var formData = new FormData();
    formData.append('username', '张三');
    formData.append('id', 123456);
    xhr.send(formData);
    
    3.可以用来处理form表单
    var form = document.getElementById('myform');
    var formData = new FormData(form);
    formData.append('secret', '123456'); // 添加一个表单项
    xhr.open('POST', form.action);
    xhr.send(formData);
    
    4.上传文件
    var formData = new FormData();
    for(var i=0;i<files.length;i++){
        formData.append('files[]', files[i]);
    }
    xhr.send(formData);
    
    5.跨域资源共享
    使用"跨域资源共享"的前提,是浏览器必须支持这个功能,而且服务器端必须同意这种"跨域"。如果能够满足上面的条件,则代码的写法与不跨域的请求完全一样。
    
    6.进度信息
    它分成上传和下载两种情况。下载的progress事件属于XMLHttpRequest对象,上传的progress事件属于XMLHttpRequest.upload对象。
    xhr.onprogress = updateProgress;
    xhr.upload.onprogress = updateProgress;
    function updateProgress(event) {
        if (event.lengthComputable) {
            var percentComplete = event.loaded / event.total;
        }
    }
    

    ajax封装

    function sendAjax() {
      //构造表单数据
      var formData = new FormData();
      formData.append('username', 'johndoe');
      formData.append('id', 123456);
      //创建xhr对象
      var xhr = new XMLHttpRequest();
      //设置xhr请求的超时时间
      xhr.timeout = 3000;
      //设置响应返回的数据格式
      xhr.responseType = "text";
      //创建一个 post 请求,采用异步
      xhr.open('POST', '/server', true);
      //注册相关事件回调处理函数
      xhr.onload = function(e) {
        if(this.status == 200||this.status == 304){
            alert(this.responseText);
        }
      };
      xhr.ontimeout = function(e) { ... };
      xhr.onerror = function(e) { ... };
      xhr.upload.onprogress = function(e) { ... };
      //发送数据
      xhr.send(formData);
    }
    

    ajax 设置 request header

    注意点:
    • 方法的第一个参数 header 大小写不敏感,即可以写成content-type,也可以写成Content-Type,甚至写成content-Type;
    • Content-Type的默认值与具体发送的数据类型有关,请参考本文【可以发送什么类型的数据】一节;
    • setRequestHeader必须在open()方法之后,send()方法之前调用,否则会抛错;
    • setRequestHeader可以调用多次,最终的值不会采用覆盖override的方式,而是采用追加append的方式。下面是一个示例代码:
    var xhr = new XMLHttpRequest();
    var url = 'http://xxx.xxx.xxx';
    xhr.open('POST',url,true);
    xhr.setRequestHeader('Content-Type', 'application/xml');
    xhr.onreadystatechange = function(){
      ...
    }
    
  • 相关阅读:
    nginx能访问html静态文件但无法访问php文件
    LeetCode "498. Diagonal Traverse"
    LeetCode "Teemo Attacking"
    LeetCode "501. Find Mode in Binary Search Tree"
    LeetCode "483. Smallest Good Base" !!
    LeetCode "467. Unique Substrings in Wraparound String" !!
    LeetCode "437. Path Sum III"
    LeetCode "454. 4Sum II"
    LeetCode "445. Add Two Numbers II"
    LeetCode "486. Predict the Winner" !!
  • 原文地址:https://www.cnblogs.com/zerohu/p/7504315.html
Copyright © 2011-2022 走看看