ajax的原生完成-XMLHttpRequest

ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种建立交互式网页运用的网页开辟手艺。当初JavaScript的革新就是ajax的涌现而转变。在当代web范畴对数据的异步加载和部分更新上也在大批采纳ajax这项手艺。

现在浏览器在运用ajax手艺上都是运用XMLHttpRequest(XHR)对象来对服务器举行交互。关于IE低版本(6/7)上则是运用的另一种完成体式格局(ActiveXObject),我们可以从URL猎取数据,而不必让全部页面革新,从而完成部分革新。如许要求的次数也会大大削减,有用勤俭资本糟蹋。XMLHttpRequest的交互道理则是XMLHttpRequst要求事宜目的(XMLHttpRequestEventTarget)从而抵达后端事宜目的。事宜目的对要求事宜举行考证完成营业逻辑,末了可以相应处置惩罚结果与前端交互。XMLHttpRequest不光能要求XML范例的数据(文本、图片、html,信息流等),一样还支撑HTTP之外的协定,比方文件流和ftp等等。相似的另有WebSockets(全双工通讯),Server-Sent event(HTML5服务器发送事宜)。

XMLHttpRequest对象的运用

在运用XMLHttpRequest之前我们须要初始化一个XMLHttpRequest对象,才运用它的属性和要领。

经常使用要领和属性:

// 初始化对象,将最早挪用该对象的组织函数
var oReq = new XMLHttpRequest();  
oReq.open(method,url,async);  // 初始化一个要求,比方 oReq.open('GET',url,true)


++++++++++++++++++++++++++++++++++++++++++
function reqListener () {
  console.log(this.responseText);
}
var oReq = new XMLHttpRequest();
oReq.onload = reqListener; // 要求加载完成挪用此要领
oReq.open("get", "yourFile.txt", true);
oReq.send();
// XMLHttpRequest一样也支撑多种时刻绑定,第一个参数为触发时刻,第二个参数为绑定实行函数
var req = new XMLHttpRequest();
req.addEventListener("progress", updateProgress, false);
req.addEventListener("load", transferComplete, false);
req.addEventListener("error", transferFailed, false);
req.addEventListener("abort", transferCanceled, false);
req.open();
//注重:必须在open()之前增加事宜监听,不然progress(进度)事宜将不会被触发
// 另外XMLHttpRequest还可以吸收二进制数据,具体操作可以浏览相干文档
var BlobBuilder = window.MozBlobBuilder || window.WebKitBlobBuilder || window.MSBlobBuilder || window.BlobBuilder;
var oReq = new XMLHttpRequest();
oReq.open("GET", "/myfile.png", true);
oReq.responseType = "arraybuffer";
oReq.onload = function(oEvent) {
  var blobBuilder = new BlobBuilder();
  blobBuilder.append(oReq.response);
  var blob = blobBuilder.getBlob("image/png");
  // ...
};
oReq.send();
+++++++++++++++++++++++++++++++++++++++++++++


oReq.setRequestHeader(header,value); //针对post要领须要设置头部信息才有用剖析参数
oReq.setRequestHeader('content-type','application/x-www-form-urlencoded');
oReq.send()要领,假如是get协定可认为空,然则假如是post协定,则传递给服务端的参数须要在这内里指定
xhr.send("foo=bar&lorem=ipsum");  // post表单数据可以经由过程for/in拼接字符串来举行
// xhr.send('string'); 
// xhr.send(new Blob()); 
// xhr.send(new Int8Array()); 
// xhr.send({ form: 'data' }); 
// xhr.send(document);
oReq.onreadystatechange = fn;  // 在readyStatus属性状况发作转变时触发
// 当readyStatus停当状况发作转变时挪用函数,状况有0-4
xhr.onreadystatechange = function() {
    if(xhr.readyState == XMLHttpRequest.DONE && xhr.status == 200) {
        // 要求完毕后,在此处写处置惩罚代码
    }
}
oReq.response // 返回相应的正文,它和reponseText的区别是,response还可所以其他范例的数据,不光是文本范例
oReq.responseText // 要求胜利会返回一个相应的字符串,假如发送失利或未发送则返回null
var xhr = new XMLHttpRequest();
xhr.open('GET', '/server', true);
// If specified, responseType must be empty string or "text"
xhr.responseType = 'text';
xhr.onload = function () {
    if (xhr.readyState === xhr.DONE) {
        if (xhr.status === 200) {
            console.log(xhr.response);
            console.log(xhr.responseText);
        }
    }
};
xhr.send(null);
// 返回一个无标记要求相应状况,比方 200,304,501,404
oReq.status 
其他属性和要领我们可以打印XMLHttpRequest对象或许参考官方文档来举行运用

get体式格局

须要注重缓存题目和编码,针对中文可以运用url编码东西举行处置惩罚,关于缓存题目可以运用增加时刻随机数来处理。

var xhr = new XMLHttpRequest();
// 第三个参数为true则运用异步I/O处置惩罚体式格局,fase为同步I/O处置惩罚体式格局(壅塞式,在没有相应数据返回时顺序会守候)
xhr.open('get','index.php?username'+encodeURI('严总')+'&age=30&'+ new Date().getTime(),true);
xhr.send();
xhr.onreadystatechange = function(){
    if(xhr.readyState == 4){
        consoel.log(xhr.responseText);
    } else {
        console.log('status:'+xhr.status);
        return false;
    }
};

post体式格局:

声清楚明了要求头以后会自动举行编码,也没有缓存题目

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        
    </style>
</head>
<body>
<input type="button" id="btn" value="request">
</body>
<script>
   var oBtn = document.querySelector('#btn');
   var userData = {
        username:'boole',
        age:30,
        address:'china'
    };
   oBtn.addEventListener('click',function(){
       var xhr = null;
       // 兼容低版本IE,这里运用非常处置惩罚分支完成,防备报错阻断顺序运转
       try{
           xhr = new XMLHttpRequest();   
       } catch(e){
           xhr = new ActiveXObject('Microsoft.XMLHTTP');
       }
        xhr.open('post','index.php',true);
        xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');
        xhr.send(changeData(userData));
        xhr.onreadystatechange = function(){
            if(xhr.readyState ==4){
                console.log(xhr.responseText);
                //字符串情势的相应数据须要举行转换成对象才运用
                console.log(JSON.parse(xhr.responseText).username);
                // 也可以运用eval预实行的体式格局举行转换
                var responseData = eval('('+xhr.responseText+')');
                for(item in responseData){
                    console.log(item + '=' + responseData[item]);
                }
                
            } else {
                console.log(xhr.status);
            }
        };
});
function changeData(oData){
    var str = '';
    for(item in oData){
        str += '&' + item + '=' + oData[item];
    }
    return str.slice(1);
}
</script>
</html>

背景在吸收到数据以后,在返回数据的时刻可以运用json的花样举行返回(比方:echo json_encode($arr);)

注重: 后端返回的responseText老是字符串花样,直接运用属性要领是不能猎取到数据的,我们须要对相应的数据举行花样转换。
要领有两种,假如后端返回的是json花样的,那末XMLHttpRequest吸收的时刻反转换成字符串情势的,
我们可以运用JSON.parse(str) 和 eval(‘(‘+str+’)’)举行转换成json对象的情势,如许一来我们就可以运用for/in对数据举行迭代处置惩罚。可以动态更新页面数据

// 此处回提醒undefined,由于是字符串情势的数据
console.log(xhr.responseText.username);
// 转换体式格局一
var reponseData = JSON.parse(xhr.responseText);
// 抓换体式格局二
var reponseData = eval('('+xhr.responseText+')');

XMLHttpRequest函数的封装

<!DOCTYPE html>
<html lang="en">
 <head> 
  <meta charset="UTF-8" /> 
  <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 
  <meta http-equiv="X-UA-Compatible" content="ie=edge" /> 
  <title>Document</title> 
  <style>
        
    </style> 
 </head> 
 <body> 
  <input type="button" id="btn" value="request" /> 
  <ul id="ul"></ul>  
  <script>
   var oBtn = document.querySelector('#btn');
   var userData = {
        username:'boole',
        age:30,
        address:'china'
    };
   oBtn.addEventListener('click',function(){
    // 定时要求部分更新
    setInterval(
    ajax('post','index.php',userData,function(data){
        var data = JSON.parse(data);
        var oUl = document.querySelector('#ul');
        var aLi = '';
        for (item in data){
            aLi +='<li>' + item + '[' + data[item] + ']</li>';
        }
        oUl.innerHTML = aLi,document.innerHTML = oUl;
    }),2000    
    );
});
// ajax函数封装,对可变数据设置形参
function ajax(method,url,data,success){
    var str = '',xhr = null;
    if(data instanceof Array || (typeof data == 'string')){
        console.log('parameter type error');
        return false;
    } else {
        for(item in data){
            str += '&' + item + '=' + data[item];
        }
        str = str.slice(1);
    }
    console.log(str);
       // 兼容低版本IE,这里运用非常处置惩罚分支完成,防备报错阻断顺序运转
       try{
           xhr = new XMLHttpRequest();   
       } catch(e){
           xhr = new ActiveXObject('Microsoft.XMLHTTP');
       }
       if(method == 'get' && data){
           url += '?' + str + '&' + new Date().getTime();
       } 
        xhr.open(method,url,true);
        if(method == 'get'){
            xhr.send();
        } else {
            xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');
            xhr.send(str);
        }
       
        xhr.onreadystatechange = function(){
            if(xhr.readyState == 4){
                if(xhr.status == 200){
                    console.log(xhr.responseText);
                    success && success(xhr.responseText);
                } else {
                    alert('要求失利,状况码:'+ xhr.status);
                }
            }
        };
}
</script>  
 </body>
</html>

参考文献:
MDN-Web-DOCS-XMLHttpRequest
W3C.ORG-XMLHttpRequest

    原文作者:逐风随想
    原文地址: https://segmentfault.com/a/1190000016068856
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞