温故js系列(12)-ajax&&优缺点&&node后端

前端进修:教程&开辟模块化/规范化/工程化/优化&东西/调试&值得关注的博客/Git&口试-前端资本汇总

迎接提issues指正:Ajax

JavaScript-Ajax&&node后端

2005年Jesse James Garrett 宣布了一篇文章,标题为:“Ajax:A new Approach to Web Applications”。他在这篇文章里引见了一种手艺叫:Ajax,即Asynchronous JavaScript And XML。这类手艺能够向服务器要求数据而不须革新悉数页面,会带来更好的用户体验。

XMLHttpRequest

Ajax手艺中心是XMLHttpRequest 对象(简称XHR),供应了向服务器发送要求和剖析服务器相应供应了流通的接口。能够以异步体式格局从服务器猎取更多的信息,在不革新网页的状况下,更新服务器最新的数据到页面上。IE7+、Firefox、Opera、Chrome 和Safari 都支撑原生的XHR对象。

var xhr = new XMLHttpRequest();  //实例化XMLHttpRequest

虽然说如今基础不必去兼容IE6了,有句话叫啥:你不必为了一点用户去进步开辟本钱。不过,进修的时刻照样要摸清楚。IE6 及以下,那末我们必需还须要运用ActiveX 对象经由过程MSXML 库来完成。兼容一下:

function CreateXHR() {
    if(window.XMLHttpRequest){
        return new XMLHttpRequest();
    }else{
        return new ActiveXObject('Microsoft.XMLHTTP');
    }
}
var xhr = new CreateXHR();  

Ajax完成

1. 实例化XMLHttpRequest

var xhr = new CreateXHR();

2. 衔接服务器

在运用XHR 对象时,必需先挪用open()要领,它吸收三个参数:要发送的要求范例(get、post)、要求的URL 和示意是不是异步,true 为异步,false 为同步。

xhr.open('get', 'xzavier', true); 

open()要领并不会真正发送要求,而只是启动一个要求以备发送。在send()之前,有一个设置自定义要求头部的要领setRequestHeader(‘key’, ‘value’);放在open 要领以后,send 要领之前。不过,平常在post提交表单时用到:

xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

3. 发送要求

当open()要领准备好以后,经由过程send()要领举行发送要求,send()要领吸收一个参数,作为要求主体发送的数据。假如不须要则,必需填null。

xhr.send(null); 

实行send()要领以后,要求就会发送到服务器上。

4. 吸收相应

当要求发送到服务器端,收到相应后,相应的数据会自动添补XHR 对象的属性。一共有四个属性,经常使用前面三个:

    属性                       申明
responseText    作为相应主体被返回的文本
status          相应的HTTP 状况
statusText      HTTP 状况的申明
responseXML     假如相应主体内容范例是"text/xml"或"application/xml",则返回包括相应数据的XML DOM 文档

吸收相应以后,第一步搜检status 属性,以肯定相应已胜利返回。平常罢了HTTP状况代码为200作为胜利的标志。HTTP状况代码:

HTTP      状况码                  申明
200   OK                    服务器胜利返回
400   Bad Request           语法毛病致使服务器没法辨认
404   Not found             URL不存在
500   Internal Server Error 服务器碰到不测毛病没法完成要求
503   ServiceUnavailable    服务器过载致使没法完成要求

列几个比较经常使用的状况码,详见:状况码
同步体式格局:

var oButton = document.getElementById('myButton');
oButton.onclick = function() {
    var xhr = new createXHR();
    xhr.open('get', 'xzavier', false); //false同步
    xhr.send(null);
    if (xhr.status == 200) { 
        console.log(xhr.responseText); 
    } else {
        console.log('error status:' + xhr.status + 'info:' + xhr.statusText);
    }
}

同步只是这项手艺的一种运用体式格局,然则很罕用,运用异步挪用才是经常使用的。运用异步挪用的时刻,须要触发readystatechange事宜,然后检测readyState属性,属性值:

属性值    状况         申明
  0     未初始化    未挪用open()要领
  1     启动       已挪用open()要领,未挪用send()要领
  2     发送       已挪用send()要领,未吸收相应
  3     吸收       已吸收到部份相应数据
  4     完成       已吸收到悉数相应数据

异步体式格局:

var oButton = document.getElementById('myButton');
oButton.onclick = function() {
    var xhr = new createXHR();
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
            if (xhr.status == 200) {
                alert(xhr.responseText);
            } else {
                console.log('error status:' + xhr.status + 'info:' + xhr.statusText);
            }
        }
    }
    xhr.open('get', '/xzavier', true); //true同步
    xhr.send(null);
}

悉数ajax异步能够总结为:

  1. 建立XMLHttpRequest对象,即建立一个异步挪用对象
  2. 建立一个新的HTTP要求,并指定该HTTP要求的要领、URL及是不是异步
  3. 设置相应HTTP要求状况变化的函数
  4. 发送HTTP要求
  5. 猎取异步挪用返回的数据
  6. 运用JavaScript和DOM完成部分革新

GET与 POST

在供应服务器要求的过程当中,有两种体式格局,分别是:GET和POST。
GET: 平经常使用于信息猎取,用URL通报参数,对发送信息数目有限定,平常2000个字符
POST:平经常使用于修正服务器上的资本,对所发送的信息没有限定
GET: 是经由过程地址栏来传值
POST:是经由过程提交表单来传值
在以下状况中,请运用 POST 要求:

  1. 没法运用缓存文件(更新服务器上的文件或数据库)
  2. 向服务器发送大批数据(POST 没有数据量限定)
  3. 发送包括未知字符的用户输入时,POST比 GET更稳固也更牢靠

GET

GET要求是最常见的要求范例,经常使用于向服务器查询某些信息。必要时,能够将查询字符串参数追加到URL的末端,以便提交给服务器。

xhr.open('get', 'xzavier?name=' + name + '&sex='+ sex , true);

经由过程URL 后的问号给服务器通报键值对数据,服务器吸收到返回相应数据。特别字符传参发生的题目能够运用encodeURIComponent()举行编码处置惩罚,中文字符的返回及传参,能够讲页面保留和设置为utf-8 花样即可。

xhr.open('get', 'xzavier?name=' + encodeURIComponent(name) + '&sex='+ encodeURIComponent(sex) , true);

POST

POST 要求能够包括非常多的数据,我们在运用表单提交的时刻,许多就是运用的POST传输体式格局。
发送POST要求的数据,不会跟在URL背面,而是经由过程send()要领向服务器提交数据。向服务器发送POST要求因为剖析机制的缘由,须要举行要求头部的处置惩罚。

xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

Ajax封装

jquery的ajax要领非常好用,不必写许多代码去区分get照样post,异步照样同步。固然了,本身用的话jquery已很完美了,用着比本身封装的好用多了,固然,环球互联网有大部份都用着jquery插件。这儿就不说jquery的ajax,我们本身来封装一个,封装一个东西也是对基础学问的稳固和提拔。

//名值对转换为字符串
function params(data) {
    var arr = [];
    for (var i in data) {
        arr.push(encodeURIComponent(i) + '=' + encodeURIComponent(data[i]));
    }
    return arr.join('&');
}
function ajax(obj) {
    var xhr = createXHR();
    obj.data = params(obj.data);
    if (obj.async === true) {
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4) {
                callback();
            }
        };
    }
    if (obj.method === 'get'){
        obj.url += obj.url.indexOf('?') == -1 ? '?' + obj.data : '&' + obj.data;
    }
    xhr.open(obj.method, obj.url, obj.async);
    if (obj.method === 'post') {
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        xhr.send(obj.data);    
    } else {
        xhr.send(null);
    }
    if (obj.async === false) {
        callback();
    }
    function callback() {
        if (xhr.status == 200) {
            obj.success(xhr.responseText);
        } else {
            console.log('error status:' + xhr.status + 'info:' + xhr.statusText);
        }    
    }
}

运用:

var oButton = document.getElementById('myButton');
oButton.onclick = function() {
    ajax({
        method : 'post',
        url : 'xzavier',
        data : {
            'name' : 'xzavier',
            'sex' : 'man'
        },
        success : function (result) {
            console.log(result);
        },
        async : true
    });
}

进修运用,要用于别处须要封装的另有许多。

后端完成

能够自学一点后端学问,便于进修。比方php,固然,如今node在前端这么火,怎么能不必呢。这里不多讲node装置、搭建项目等学问了,等以后本身再熟一点再写。

var oButton = document.getElementById('myButton');
var sName = document.getElementById('isName').value;
oButton.onclick = function() {
    ajax({
        method : 'post',
        url : 'isuser',
        data : sName,
        success : function () {
            console.log('useable name');
        },
        async : false
    });
}

node端:node进修(朴灵的书: 深入浅出nodeJs)
//用户注册时推断用户名是不是已存在

app.post('/isuser', function(req, res) {
  var username = req.body.username;
  User.isUser(username, function(status){  //查询数据库,牵涉学问点多,不详述    
    if(status == 'OK'){
      res.send(200);          
    }else{
      res.send(404);
    }
  });
});

Ajax优瑕玷

Ajax带来的长处:
1、经由过程异步形式,完成动态不革新,提拔了用户体验
2、优化了浏览器和服务器之间的传输,削减不必要的数据往复,削减了带宽占用
3、Ajax在客户端运转,负担了一部份本因由服务器负担的事情,削减了大用户量下的服务器负载

Ajax的瑕玷:
1、Ajax不支撑浏览器back按钮
2、安全题目,Ajax暴露了与服务器交互的细节
3、对搜索引擎的支撑比较弱
4、破坏了顺序的非常机制
5、不容易调试
虽然优瑕玷,然则研发职员就是战胜并完美手艺瑕玷,发扬手艺长处的存在O(∩_∩)O~

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