ajax基础总结笔记

AJAX

AJAX,即 Asynchronous(异步的) JavaScript and XML。
AJAX不是一门新的语言,而是对现有技术的综合运用。
其本质是在HTTP协议的基础上以异步的方式与服务器进行通信。
AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量的数据交换,AJAX可以使网页实现异步更新。即在不重载整个网页面的情况下,对网页的某部分进行更新。

AJAX 的好处

AJAX 可以实现异步通信效果,实现页面局部刷新,带来更好的用户体验:按需获取数据,节约宽带资源。

AJAX 的缺点

  1. AJAX 不支持浏览器的 back 按钮。
  2. 安全问题。AJAX 暴露了与服务器交互的细节。
  3. 对搜索引擎的支持比较弱。
  4. 破坏了程序的异常机制

异步

指某段程序执行时不会阻塞其它程序执行,其表现形式为程序的执行顺序,不依赖程序本身的书写顺序,相反则为同步。其优势在于不阻塞程序的执行,从而提升整体的执行效率。

实现异步加载的方式

  1. defer 只支持ie
<script type="text/javascript" defer="defer"></script>
  1. async html5的属性
<script type="text/javascript" src="" async="async"></script>
  1. 动态创建script
function loadScript(url, callback){
  var script = document.createElement("script")
  script.type = "text/javascript";
  if (script.readyState){ //IE
    script.onreadystatechange = function(){
      if (script.readyState == "loaded" ||script.readyState == "complete"){
        script.onreadystatechange = null;
        callback();
      }
    };
  } else { //Others: Firefox, Safari, Chrome, and Opera
    script.onload = function(){
      callback();
    };
  }
  script.src = url;
  document.body.appendChild(script);
}
  1. 由于javascript的动态性,还有很多异步加载的方法:XHR Injection、XHR Eval、Script In Iframe、Script defer属性等等。
  • XHR Injection(XHR 注入):通过XMLHttpRequest来获取javascript,然后创建一个script元素插入到DOM结构中。ajax请求成功后设置script.text为请求成功后返回的responseText。

另外:实现异步编程有哪些方式。(摘自Javascript异步编程的4种方法

  1. 回调函数 callback
function f1(callback){
  setTimeout(function () {
    //f1的任务代码
    callback();
  },1000);
}

回调函数的优点是简单,易理解和部署,缺点是不利于代码阅读和维护,各部分之间高度耦合,流程会很混乱,而且每个任务只能指定一个回调函数。

  1. 事件监听
f1.on('done', f2);
function f1() {
  setTimeout(function () {
    //f1的任务代码
    f1.trigger('done');
  }, 1000);
}

这种方法的优点是比较容易理解,可以绑定多个事件,每个事件可以指定多个回调函数,而且可以“去耦合”,有利于实现模块化。缺点是整个程序都要变成事件驱动型,运行流程会变得很不清晰。

  1. 发布/订阅
    采用的是Ben Alman 的 Tiny Pub/Sub
jQuery.subscribe("done", f2);
function f1() {
  setTimeout(function () {
    //f1的任务代码
    jQuery.publish("done")
  }, 1000);
}

发布/订阅模式(public-subscribe pattern),又称观察者模式(observer pattern)。
f1执行完成后向信号中心发布done信号,从而引发f2的执行。
f2执,行完成后可以取消订阅。

jQuery.unsubscribe("done", f2);

这种方法的性质和“事件监听”类似,但是明显优于后者。因为我们可以通过查看“消息中心”。了解存在多少信号、每个信号有多少订阅者,从而监控程序的运行。

  1. Promise对象
    ES6是由社区最早提出和实现,ES6将其写进了语言标准,统一了用法,原生提供了Promise对象。
    从语法上说,Promise是一个对象,可以获取异步操作的结果,它有三种状态。
  • Pending(进行中)
  • Resolved(已完成,又称Fulfilled)
  • Rejected(已失败)
    只有异步操作的结果,可以决定当前是哪一种状态。
    一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:
  • 从 Pending 变为 Resolved。
  • 从 Pending 变为 Rejected。
var promise = new Promise(function(resolve, reject) {
  if (/* 异步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});
promise.then(function(value) {
  // success
}, function(error) {
  // failure
});

扯远了...


同步异步的区别

  1. 同步:阻塞的
    浏览器向服务器请求数据,服务器比较忙,浏览器一直等着(页面白屏),直到服务器返回数据,浏览器才能显示页面。
  2. 异步:非阻塞的
    浏览器向服务器请求数据,服务器比较忙,浏览器可以自如的干原来的事情(显示页面),服务器返回数据的时候通知浏览器一声,浏览器把返回的数据再渲染到页面,局部更新。

XMLhttpRequest

XMLhttpRequest可以以异步方式的处理程序。
浏览器内建对象,用于在后台与服务器通信(交换数据),由此我们便可实现对网页的部分更新,而不是刷新整个页面。
一个基本的例子:

//实例化
var xhr = new XMLHttpRequest();
//发起一个http请求
xhr.open('get', 'index.php');
xhr.send(null);
//接收服务器响应
xhr.onreadystatechange = function () {
  if(xhr.readyState == 4 && xhr.status == 200) {
    var result = document.querySelector('.result');
    result.innerHTML = xhr.responseText
  }
}

请求

XMLHttpRequest 本质基于 HTTP 协议实现通信。HTTP 请求 3 个组成部分与 XMLHttpRequest 方法的对应关系:

  1. 请求行
xhr.open('get', 'index.php')
  1. 请求头(get 请求可以不设置)
xhr.setRequestHeader('Content-Type', 'text/html');
  1. 请求主体
xhr.send(null);

响应

HTTP响应 3 个组成部分与 XMLHttpRequest 方法或属性的对应关系。
由于服务器做出响应需要时间(比如网速慢等原因),所以我们需要监听服务器响应的状态,然后才能进行处理。

xhr.onreadystatechange = function () {
  if(xhr.readyState == 4 && xhr.status == 200) {
    var result = document.querySelector('.result');
    result.innerHTML = xhr.responseText;
  }
}

onreadystatechange 是 Javascript 的事件的一种,其意义在于监听 XMLHttpRequest 的状态。

  1. 获取状态行(包括状态码和状态信息)
xhr.status
xhr.statusText
  1. 获取响应头
//获取指定头信息
xhr.getResponseHeader('Content-Type');
//获取所有响应头信息
hr.getAllResponseHeaders();
  1. 响应主体
xhr.responseText;
xhr.responseXML;

我们需要检测并判断响应头的 MIME 类型后确定使用 request.responseText 或者 request.responseXML.

创建一个 ajax

var xhr = null;//创建对象
if (window.XMLHttpRequest) {
  xhr = new XHLHttpRequest();
}else {
  xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
xhr.open("方式", "地址", "标志位");//初始化请求
xhr.setRequestHeader("","")//设置相应头信息
xhr.onreadystatechange = function () {}//指定回调函数
xhr.send();//发送请求

简述ajax的过程

  1. 创建 XMLHttpRequest 对象,也就是创建一个异步调用对象。
  2. 创建一个新的 HTTP 请求,并指定该 HTTP 请求的方法、URL 及验证信息。
  3. 设置响应 HTTP 请求状态变化的函数。
  4. 发送 HTTP 请求
  5. 获取异步调用返回的数据
  6. 使用 JavaScript 和 DOM 实现局部刷新

get 和 post 请求方式的差异

  • get 请求没有请求主体,使用 xhr.send(null)。
  • get 可以通过在请求 URL 上添加请求参数。
  • post 可以通过 xhr.send('name=i&age=10')。
  • post 需要设置请求头 xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
  • get 效率更好(应用比较多)。
  • get 大小限制约 4K,post则没有限制。

get 和 post 的区别,什么时候使用 post 请求

  • get:一般用于信息获取,使用 URL 传递参数,对所发信息的数量也有限制,一般在 2000 个字符,有的浏览器是 8000 个字符。
  • 一般用于修改服务器上的资源,对所发送的信息没有限制。
    以下情况中,使用post 请求:
    1. 无法使用缓存文件(更新服务器上的文件或数据库)
    2. 向服务器发送大量数据(post 没有数据量限制)
    3. 发送包含未知字符的用户输入时,post 比 get 更稳定也更可靠。

jquery 中的 ajax

  • $.ajax({}) 可配置方式发起 Ajax 请求。
  • $.get() 以 get 方式发起 Ajax 请求。
  • $.post() 以 post 方式发起ajax请求。
  • $('form').serialize() 序列化表单(即格式化 key=val&key=val)
  • url 接口地址
  • type 请求方式
  • timeout 请求超时
  • dataType 服务器返回格式
  • data 发送请求数据
  • beforeSend:function(){} 请求发起前调用
  • success 成功响应后调用
  • error 错误响应时调用
  • complete 响应完成时调用(包括成功和失败)

jQuery 参考手册 - Ajax

最后

忽然发现已经忘了 ajax 的一些理论基础方面的知识了... 面试忽然问起,恩,懵住了... 所以学习嘛,还是要时常复习。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容