资讯专栏INFORMATION COLUMN

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

LiangJ / 3108人阅读

摘要:接收响应当请求发送到服务器端,收到响应后,响应的数据会自动填充对象的属性。一般而已状态代码为作为成功的标志。必要时,可以将查询字符串参数追加到的末尾,以便提交给服务器。后端实现可以自学一点后端知识,便于学习。

前端学习:教程&开发模块化/规范化/工程化/优化&工具/调试&值得关注的博客/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对象。

</>复制代码

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

虽然说现在基本不用去兼容IE6了,有句话叫啥:你不用为了一点用户去提高开发成本。不过,学习的时候还是要摸清楚。IE6 及以下,那么我们必须还需要使用ActiveX 对象通过MSXML 库来实现。兼容一下:

</>复制代码

  1. function CreateXHR() {
  2. if(window.XMLHttpRequest){
  3. return new XMLHttpRequest();
  4. }else{
  5. return new ActiveXObject("Microsoft.XMLHTTP");
  6. }
  7. }
  8. var xhr = new CreateXHR();
Ajax实现 1. 实例化XMLHttpRequest

</>复制代码

  1. var xhr = new CreateXHR();
2. 连接服务器

在使用XHR 对象时,必须先调用open()方法,它接受三个参数:要发送的请求类型(get、post)、请求的URL 和表示是否异步,true 为异步,false 为同步。

</>复制代码

  1. xhr.open("get", "xzavier", true);

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

</>复制代码

  1. xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
3. 发送请求

当open()方法准备好之后,通过send()方法进行发送请求,send()方法接受一个参数,作为请求主体发送的数据。如果不需要则,必须填null。

</>复制代码

  1. xhr.send(null);

执行send()方法之后,请求就会发送到服务器上。

4. 接收响应

当请求发送到服务器端,收到响应后,响应的数据会自动填充XHR 对象的属性。一共有四个属性,常用前面三个:

</>复制代码

  1. 属性 说明
  2. responseText 作为响应主体被返回的文本
  3. status 响应的HTTP 状态
  4. statusText HTTP 状态的说明
  5. responseXML 如果响应主体内容类型是"text/xml""application/xml",则返回包含响应数据的XML DOM 文档

接受响应之后,第一步检查status 属性,以确定响应已经成功返回。一般而已HTTP状态代码为200作为成功的标志。HTTP状态代码:

</>复制代码

  1. HTTP 状态码 说明
  2. 200 OK 服务器成功返回
  3. 400 Bad Request 语法错误导致服务器无法识别
  4. 404 Not found URL不存在
  5. 500 Internal Server Error 服务器遇到意外错误无法完成请求
  6. 503 ServiceUnavailable 服务器过载导致无法完成请求

列几个比较常用的状态码,详见:状态码
同步方式:

</>复制代码

  1. var oButton = document.getElementById("myButton");
  2. oButton.onclick = function() {
  3. var xhr = new createXHR();
  4. xhr.open("get", "xzavier", false); //false同步
  5. xhr.send(null);
  6. if (xhr.status == 200) {
  7. console.log(xhr.responseText);
  8. } else {
  9. console.log("error status:" + xhr.status + "info:" + xhr.statusText);
  10. }
  11. }

同步只是这项技术的一种使用方式,但是很少用,使用异步调用才是常用的。使用异步调用的时候,需要触发readystatechange事件,然后检测readyState属性,属性值:

</>复制代码

  1. 属性值 状态 说明
  2. 0 未初始化 未调用open()方法
  3. 1 启动 已经调用open()方法,未调用send()方法
  4. 2 发送 已经调用send()方法,未接受响应
  5. 3 接受 已经接受到部分响应数据
  6. 4 完成 已经接受到全部响应数据

异步方式:

</>复制代码

  1. var oButton = document.getElementById("myButton");
  2. oButton.onclick = function() {
  3. var xhr = new createXHR();
  4. xhr.onreadystatechange = function () {
  5. if (xhr.readyState == 4) {
  6. if (xhr.status == 200) {
  7. alert(xhr.responseText);
  8. } else {
  9. console.log("error status:" + xhr.status + "info:" + xhr.statusText);
  10. }
  11. }
  12. }
  13. xhr.open("get", "/xzavier", true); //true同步
  14. xhr.send(null);
  15. }

整个ajax异步可以总结为:

创建XMLHttpRequest对象,即创建一个异步调用对象

创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及是否异步

设置响应HTTP请求状态变化的函数

发送HTTP请求

获取异步调用返回的数据

使用JavaScript和DOM实现局部刷新

GET与 POST

在提供服务器请求的过程中,有两种方式,分别是:GET和POST。
GET: 一般用于信息获取,用URL传递参数,对发送信息数量有限制,一般2000个字符
POST:一般用于修改服务器上的资源,对所发送的信息没有限制
GET: 是通过地址栏来传值
POST:是通过提交表单来传值
在以下情况中,请使用 POST 请求:

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

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

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

GET

GET请求是最常见的请求类型,常用于向服务器查询某些信息。必要时,可以将查询字符串参数追加到URL的末尾,以便提交给服务器。

</>复制代码

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

通过URL 后的问号给服务器传递键值对数据,服务器接收到返回响应数据。特殊字符传参产生的问题可以使用encodeURIComponent()进行编码处理,中文字符的返回及传参,可以讲页面保存和设置为utf-8 格式即可。

</>复制代码

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

POST 请求可以包含非常多的数据,我们在使用表单提交的时候,很多就是使用的POST传输方式。
发送POST请求的数据,不会跟在URL后面,而是通过send()方法向服务器提交数据。向服务器发送POST请求由于解析机制的原因,需要进行请求头部的处理。

</>复制代码

  1. xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
Ajax封装

jquery的ajax方法非常好用,不用写很多代码去区别get还是post,异步还是同步。当然了,自己用的话jquery已经很完美了,用着比自己封装的好用多了,当然,全球互联网有大部分都用着jquery插件。这儿就不说jquery的ajax,我们自己来封装一个,封装一个东西也是对基础知识的巩固和提升。

</>复制代码

  1. //名值对转换为字符串
  2. function params(data) {
  3. var arr = [];
  4. for (var i in data) {
  5. arr.push(encodeURIComponent(i) + "=" + encodeURIComponent(data[i]));
  6. }
  7. return arr.join("&");
  8. }
  9. function ajax(obj) {
  10. var xhr = createXHR();
  11. obj.data = params(obj.data);
  12. if (obj.async === true) {
  13. xhr.onreadystatechange = function () {
  14. if (xhr.readyState == 4) {
  15. callback();
  16. }
  17. };
  18. }
  19. if (obj.method === "get"){
  20. obj.url += obj.url.indexOf("?") == -1 ? "?" + obj.data : "&" + obj.data;
  21. }
  22. xhr.open(obj.method, obj.url, obj.async);
  23. if (obj.method === "post") {
  24. xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  25. xhr.send(obj.data);
  26. } else {
  27. xhr.send(null);
  28. }
  29. if (obj.async === false) {
  30. callback();
  31. }
  32. function callback() {
  33. if (xhr.status == 200) {
  34. obj.success(xhr.responseText);
  35. } else {
  36. console.log("error status:" + xhr.status + "info:" + xhr.statusText);
  37. }
  38. }
  39. }

使用:

</>复制代码

  1. var oButton = document.getElementById("myButton");
  2. oButton.onclick = function() {
  3. ajax({
  4. method : "post",
  5. url : "xzavier",
  6. data : {
  7. "name" : "xzavier",
  8. "sex" : "man"
  9. },
  10. success : function (result) {
  11. console.log(result);
  12. },
  13. async : true
  14. });
  15. }

学习使用,要用于别处需要封装的还有很多。

后端实现

可以自学一点后端知识,便于学习。比如php,当然,现在node在前端这么火,怎么能不用呢。这里不多讲node安装、搭建项目等知识了,等之后自己再熟一点再写。

</>复制代码

  1. var oButton = document.getElementById("myButton");
  2. var sName = document.getElementById("isName").value;
  3. oButton.onclick = function() {
  4. ajax({
  5. method : "post",
  6. url : "isuser",
  7. data : sName,
  8. success : function () {
  9. console.log("useable name");
  10. },
  11. async : false
  12. });
  13. }

node端:node学习(朴灵的书: 深入浅出nodeJs)
//用户注册时判断用户名是否已存在

</>复制代码

  1. app.post("/isuser", function(req, res) {
  2. var username = req.body.username;
  3. User.isUser(username, function(status){ //查询数据库,牵扯知识点多,不详述
  4. if(status == "OK"){
  5. res.send(200);
  6. }else{
  7. res.send(404);
  8. }
  9. });
  10. });
Ajax优缺点

Ajax带来的好处:
1、通过异步模式,实现动态不刷新,提升了用户体验
2、优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用
3、Ajax在客户端运行,承担了一部分本来由服务器承担的工作,减少了大用户量下的服务器负载

Ajax的缺点:
1、Ajax不支持浏览器back按钮
2、安全问题,Ajax暴露了与服务器交互的细节
3、对搜索引擎的支持比较弱
4、破坏了程序的异常机制
5、不容易调试
虽然优缺点,但是研发人员就是克服并完善技术缺点,发扬技术优点的存在O(∩_∩)O~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80207.html

相关文章

  • 温故js系列(3)-cookie缺点&amp;设置获取删除cookie

    摘要:优缺点优点只在中存放不敏感数据,即使被盗也不会有重大损失。控制的生命期,使之不会永远有效。极高的扩展性和可用性,使用简单,操作方法方便缺点数量和长度的限制。每个长度不能超过,否则会被截掉。设置一般主要设置名字和值有效期路径域名是否安全传输。 前端学习:教程&开发模块化/规范化/工程化/优化&工具/调试&值得关注的博客/Git&面试-前端资源汇总 欢迎提issues斧正:cookie J...

    Vultr 评论0 收藏0
  • 温故js系列(2)-快速排序&amp;插入排序&amp;选择排序&amp;冒泡排序算法&amp;优化

    摘要:优化当待排序序列长度时,使用插入排序,可以加速排序。插入排序原理通过构建有序序列,对于未排序元素,在已排序序列中从后向前扫描,找到相应位置并插入。堆排序可通过树形结构保存部分比较结果,可减少比较次数。 前端学习:教程&开发模块化/规范化/工程化/优化&工具/调试&值得关注的博客/Git&面试-前端资源汇总 欢迎提issues斧正:排序算法 JavaScript-排序算法及简易优化 快速...

    ningwang 评论0 收藏0
  • 温故js系列(14)-闭包&amp;垃圾回收&amp;内存泄露&amp;闭包应用&amp;作用域链&

    摘要:该对象包含了函数的所有局部变量命名参数参数集合以及,然后此对象会被推入作用域链的前端。如果整个作用域链上都无法找到,则返回。此时的作用域链包含了两个对象的活动对象和对象。 前端学习:教程&开发模块化/规范化/工程化/优化&工具/调试&值得关注的博客/Git&面试-前端资源汇总 欢迎提issues斧正:闭包 JavaScript-闭包 闭包(closure)是一个让人又爱又恨的somet...

    Amio 评论0 收藏0
  • 温故js系列(15)-原型&amp;原型链&amp;原型继承

    摘要:给添加属性给的原型对象添加属性原型链在中,每个对象都有一个属性,其保存着的地址就构成了对象的原型链。实例变量实例函数原型链继承有了原型链,就可以借助原型链实现继承。是中唯一一个处理属性但是不查找原型链的函数。 前端学习:教程&开发模块化/规范化/工程化/优化&工具/调试&值得关注的博客/Git&面试-前端资源汇总 欢迎提issues斧正:原型&原型链&原型继承 JavaScript-原...

    Ethan815 评论0 收藏0
  • 温故js系列(9)-相等==&amp;严格相等===&amp;代码里的那些判断

    摘要:业务越复杂,逻辑就越复杂,判断就越多比较判断比较判断是比较两个值,返回一个布尔值,表示是否满足比较条件。对于非布尔值的数据,取反运算符会自动将其转为布尔值。 前端学习:教程&开发模块化/规范化/工程化/优化&工具/调试&值得关注的博客/Git&面试-前端资源汇总 欢迎提issues斧正:========== JavaScript-判断 代码中,多多少少会有判断语句。业务越复杂,逻辑就越...

    libin19890520 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<