浓缩解读前端系列书籍

《高性能JavaScript》读书笔记⑦:Ajax

2016-11-16  本文已影响48人  梁同学de自言自语

数据传输(Data Transmission)

数据请求(Requesting Data)
<script>
   var url = '/data.php';
   var params = ['id=640202047','limit20'];
   var req = new XMLHttpRequest();
   req.onreadystatechange = function(){
      if(req.readyState == 4){
         //获取响应头信息
         var reqsponseHeaders = req.getAllResponseHeaders();
         //获取数据
         var data = req.responseText;
      }
   }
   req.open('GET',url+'?'+params.join('&',true));
   //设置请求头信息
   req.setRequestHeader('X-Requested-With','XMLHttpRequest');
   //发送请求
   req.send(null);
</script>
var scriptElement = document.createElement('script');
scriptElement.src = 'http://any-domain.com/javascript/lib.js';
document.getElementsByTagName('head')[0].appendChild(scriptElement);
function jsonCallback(jsonString){
    var data = eval('(' + jsonString + ')');
}
jsonCallback({'status':1,"colors":['#fff','#000','#ff0000']});
var req = new XMLHttpRequest();
var getLatesPacketInterval,lastLength = 0;
req.open('GET','rollup_image.php',true);
req.openreadystatechange = readyStateHander;
req.send(null);
function readyStateHander(){
    if(req.readyState == 3){
        //开始轮询
       getLatestPacketInterval = window.setInterval(function(){
            getLaesPacket();
        },15);
    }

    if(req.readyState == 4){
        //停止轮询
        clearInterval(getLatestPacketInterval);
        //获取最后一个数据包
        getLaesPacket();
    }
}
function getLaesPacket(){
    var length = req.responseText.length;
    var packet = req.responseText.substring(lastLength,length);
    processPacket(packet);
    lastLenght = length;
}

readySate状态为3时,启动一个定时器,每15毫秒检查一次响应中的新数据。数据片段会被收集起来,直到发现一个分隔符,然后就把遇到分隔符之前的数据作为一个完整的资源进行处理。(编写健壮的MXHR代码比较复杂,但却值得研究)

发送数据(Sending Data)

var url = '/data.php';
var params = ['id=640202047','limit20'];
var req = new XMLHttpRequest();
req.onreadystatechange = function(){
   if(req.readyState == 4){
      //成功
   }
};
//处理发送失败的情况
req.onerror = fucntion(){
    setTimeout(arguments.callee,1000);
};
req.open('POST',url+'?'+params.join('&',true));
//设置请求头信息
req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
req.setRequestHeader('Content-Length',params.length);
//发送请求
req.send(param.join('&'));
var url = '/status_tracker.php';
var params = ['id=640202047','limit20'];
(new Image()).src = url + '?' + param.join(‘&’);
//注意:创建Image元素即可,不需要插入DOM

数据格式(DataS Formats)

function parseXml(responseXML){
    var users = [];
    var userNodes = responseXML.getElementsByName('users');
    var node,usernameNodes.usernameNode,username,
     realnameNodes,realnameNode,realname,
     emailNodes,emailNode,email;
 for (var i=0,len=userNodes.length;i<len;i++) {
 //获取节点
 node = userNodes[i];
 //初始化变量
 username = realname = email = '';
 //解析用户名
 usernameNode = node.getElementsByTagName('username');
 if(usernameNode && usernameNodes[0]){
 usernameNode = usernameNodes[0];
 username = (usernameNodes.firstChild())?
 usernameNodes.firstChild():'';
 }
 //解析本名
 realnameNodes = node.getElementsByTagName('realname');
 if(realnameNode && realnameNodes[0]){
 realnameNode = realnameNodes[0];
 realname = (realnameNodes.firstChild())?
 realnameNodes.firstChild():'';
 }
 //解析邮箱地址
 emailNodes = node.getElementsByTagName('email');
 if(emailNode && emailNodes[0]){
 emailNode = emailNodes[0];
 email = (emailNodes.firstChild())?
 emailNodes.firstChild():'';
 }
 //放入数组
 user[i] = {
 id : node.getAtrribute('id'),
 username : username,
 realname : realname,
 email : email
 };
 }
}
function parseXml(responseText){
    var users = [];
    var userArray = eval('(' + responseText + ')');
    for (var i=0,len=userArray.length;i<len;i++) {
     users[i] = {
     id : userArray[i][0],
     username : userArray[i][1],
     realname : userArray[i][2],
     email : userArray[i][3]
     }
    }
}
document.getElementById('data-container').innerHTML = req.responseText;
1:alice:Alice Smith:alice@alicesmih.com;
2:bob:Bob Jones:bob@bobjones.com;
3.dave:Dave Johnson:dave@daejohnson.com;
function parseXml(responseText){
    var users = [];
    var userEncoded = responseText.split(';');
    var userArray;
    for (var i=0,len=userEncoded .length;i<len;i++) {
        userArray = userEncoded[i].split(':');
     users[i] = {
     id : userArray[i][0],
     username : userArray[i][1],
     realname : userArray[i][2],
     email : userArray[i][3]
     };
    }
}

Ajax性能指南(Ajax Performance Guidelines)

缓存数据(Cache Data)
var localCache = {};    //缓存集合
var url = '/data.php';
function xhrRequest(url,callback){
 //检查本地缓存的URL
 if(localCache[url]){
 callback.success(localCache[url]);
 return;
 }
 var req = createHhrObject();
 req.onerror = fucntion(){
     callback.error();
 };
 req.onreadystatechange = function(){
      if(req.readyState == 4){
       if(req.responseText === ''|| req.status == '404'){
       callback.error();
       }
        //存储响应文本到本地缓存
        localCache[url] = req.responseText;
        callback.success(req.responseText);
      }
   };
   req.open('GET',url,true);
   req.send(null);
}
了解Ajax类库的局限(Know the Limitations of Your Ajax Library)
上一篇 下一篇

猜你喜欢

热点阅读