Ajax详解

Ajax

Ajax 全称是 asynchronous javascript and xml,并非新的编程言语,能够说是已有手艺的组合,重要用来完成客户端与服务器端的异步通讯效果,完成页面的部份革新,从而竖立疾速动态网页的手艺。

Ajax历程

-  竖立XMLHttpRequest对象,也就是竖立一个异步挪用对象
-  竖立一个新的HTTP要求,并指定其要求的要领、URL及考证信息
-  设置相应 HTTP 要求状况变化的函数
-  发送 HTTP 要求
-  猎取异步挪用返回的数据
-  运用 JavaScript 和 DOM 完成部份革新
var xhr = null; // 竖立异步对象
if(window.XMLHttpRequest){
  xhr = new XMLHttpRequest(); // ie7+等当代浏览器
}else if(window.ActiveXObject){ // ie6,老版Opera
  xhr = new ActiveXObject('Microsft.XMLHTTP');
}
xhr.open('get','http://localhost:4000/test',true); // true是异步,可省略
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"); // post 必需设置
xhr.onreadystatechange = function(){ // 若为同步,此代码不必写,直接在send后,用`xhr.responseText`即可。
    if(xhr.readyState==4 && xhr.status==200){
    /* 
    readyState
        0: 要求未初始化
        1: 服务器衔接已竖立
        2: 要求已吸收
        3: 要求处置惩罚中
        4: 要求已完成,且相应已停当
    status
        200 OK
        404 Not Found
    */
      xhr.responseText;
      xhr.responseXML.children[0].children;
      JSON.parse(xhr.responseText);
    }
}
xhr.send(String); // 用于post传参,情势:"a=1&b=2",而get传参就在url背面用“?”拼接

优瑕玷

  • 长处:能够使得页面不重载全部内容的情况下加载部份内容,下降数据传输量,防止用户不停革新或许跳转页面,进步用户体验
  • 瑕玷:对搜索引擎不友好,要完成ajax下的行进退却功用本钱较大;跨域题目限定

jQuery 中的 Ajax

全局ajax事宜处置惩罚器

jQuery 库支撑完全的 Ajax 操纵。这里所包括的一切函数和要领用于从服务端加载数据,而且不会致使页面革新

  • $(document).ajaxComplete(handler(event, XMLHttpRequest, ajaxOptions)) 当Ajax要求完成后注册一个回调函数。

    • 每当一个Ajax要求完成,jQuery就会触发ajaxComplete事宜,在这个时刻点一切处置惩罚函数会运用.ajaxComplete()要领注册并实行。
    • 从 jQuery 1.8 最先, .ajaxComplete() 要领只能绑定到 document元素。
    • 假如global选项设置为false,挪用$.ajax() 或 $.ajaxSetup(),.ajaxComplete()要领将不会被触发。
  • 相似的另有:要求失足ajaxError()、要求发送前ajaxSend()、要求刚最先ajaxStart()、要求完成时ajaxStop()、要求胜利完成时ajaxSuccess()

辅佐函数

  • $.param() 竖立一个数组或对象序列化的字符串,适用于一个URL地点查询字符串或Ajax要求。此要领没法对庞杂数据结构举行编码。
  • serialize() 将用作提交的表单元素的值编译成字符串。
<form action="#">
    <input name="username" value="abc">
    <input name="age" value="24">
    <select name="sex">
        <option value="0">女</option>
        <option value="1">男</option>
    </select>
    <input type="submit" value="提交">
</form>

console.log($("form").serialize()); // username=abc&age=24&sex=0
  • serializeArray() 将用作提交的表单元素的值编译成具有name和value对象构成的数组。

console.log($("form").serializeArray()); // [{name: "username", value: "abc"}, {name: "age", value: "24"}, {name: "sex", value: "0"}]

底层接口

  • $.ajax(url, {})$.ajax({url: ""}) 关于传参项(能够运用$.ajaxSetup()设置任何默许参数),下面枚举一些经常使用的:

    • url:String,一个用来包括发送要求的URL字符串
    • data:Object、String,发送到服务器的数据。将自动转换为要求字符串花样。GET 要求中将附加在 URL 背面。
    • dataType:String,默许Intelligent Guess (xml, json, script, or html))。预期服务器返回的数据范例。

      • xmlhtmlscriptjsontext
      • jsonp: 以 JSONP 的体式格局载入 JSON 数据块。会自动在所要求的URL末了增加 “?callback=?”。默许情况下不会经由过程在URL中附加查询字符串变量 “_=[TIMESTAMP]” 举行自动缓存效果,除非将 cache参数设置为true。
    • accepts:PlainObject(可用$.isPlainObject()检测),内容范例发送要求头(Content-Type),用于关照服务器该要求须要吸收何种范例的返回效果。假如accepts设置须要修正,推荐在$.ajaxSetup() 要领中设置一次。
    • async:Boolean,默许true,异步要求
    • global:Boolean,默许true。该要求是不是触发全局处置惩罚事宜(如$(document).ajaxComplete()等)
    • beforeSend(jqXHR, settings):Function,要求发送前的回调函数,用来修正要求发送前jqXHR,此功用可用来设置自定义 HTTP 头信息,在beforeSend函数中返回false将作废这个要求。
    • catch:Boolean,默许true,dataType为”script”和”jsonp”时默许为false。是不是缓存此页面,道理是在GET要求参数中附加”_=时刻戳”。该参数不是其他要求所必需的,除了在IE8中,当一个POST要求一个已用GET要求过的URL。
    • complete:Function,要求完成后回调函数 (要求success 和 error今后均挪用)。
    • success(data, textStatus, jqXHR):Function,要求胜利时挪用函数
    • error:Function,要求失利时挪用函数
    • timeout:Number,设置要求超时时刻(毫秒)。此设置将掩盖$.ajaxSetup() 里的全局设置。
    • jsonp:String,在一个jsonp要求中重写回调函数的名字。这个值用来替换在”callback=?”这类GET或POST要求中URL参数里的”callback”部份,比方{jsonp:’onJsonPLoad’}会致使将”onJsonPLoad=?”传给服务器。在jQuery 1.5,,设置jsonp选项为false,阻挠了jQuery从到场”?callback”字符串的URL或试图运用”=?”转换。在这类情况下,你也应当明白设置jsonpCallback设置。比方, { jsonp: false, jsonpCallback: “callbackName” }
    • jsonpCallback:String、Function,为jsonp要求指定一个回调函数名。这个值将用来庖代jQuery自动天生的随机函数名。这重要用来让jQuery天生一个奇特的函数名,如许治理要求更轻易,也能方便地供应回调函数和错误处置惩罚。你也能够在想让浏览器缓存GET要求的时刻,指定这个回调函数名。从jQuery 1.5最先,你也能够运用一个函数作为该参数设置,在这类情况下,该函数的返回值就是jsonpCallback的效果。
    • contents: PlainObject,一个以”{字符串/正则表达式}”配对的对象,依据给定的内容范例,剖析要求的返回效果。
    • contentType:String,默许application/x-www-form-urlencoded; charset=UTF-8。发送信息至服务器时内容编码范例。
    • context:Object,设置Ajax相关回调函数的上下文。即改变回调函数的this,默许就是传入的全部对象。
    • converters: PlainObject,默许: {“* text”: window.String, “text html”: true, “text json”: jQuery.parseJSON, “text xml”: jQuery.parseXML}。一个数据范例到数据范例转换器的对象。每一个转换器的值是一个函数,返回经转换后的要求效果。
    • crossDomain:Boolean,同域要求为false, 跨域要求为true。假如你想在统一域中强迫跨域要求(如JSONP情势),比方,想服务器端重定向到另一个域,那末须要将crossDomain设置为 true 。
    • username:String,于相应HTTP接见认证要求的用户名
    • password:String,用于相应HTTP接见认证要求的暗码
  • $.ajax() 返回jqXHR对象,可挪用

    • .done() success
    • .fail() error
    • .always() complete
    • .then() 传两个回调函数,分别是done和fail
  • $.ajaxPrefilter([dataTypes], handler(options, originalOptions, jqXHR) ) 在每一个要求之前被发送和$.ajax()处置惩罚它们前处置惩罚,设置自定义Ajax选项或修正现有选项。
  • $.ajaxSetup(options) 为今后要用到的Ajax要求设置默许的值,厥后的 AJAX 要求不再设置任何已设置的选项参数。

快速要领

  • $.get() {type: “get”}
  • $.post() {type: “post”}
  • $.getScript() {type: “script”}
  • $.getJSON() {type: “json”}
  • $(selector).load() 从服务器载入数据而且将返回的 HTML 代码并插进去至 婚配的元素中。

jQuery中jsonp

// 前端
function jsonpFn(data){
    console.log(data)
    console.log("jsonpFn");
}
$(function(){
    $.ajax({
        url: "http://localhost:3000/test",
        data: {username: "xx"},
        dataType: "jsonp",
        jsonp: "selfNamedReplaceCallback",
        jsonpCallback: "jsonpFn", // server side:req.query.callback = "jsonpFn"
        success(data){
            console.log(data)
        }
    })
})

// 后端
const app = require('express').Router();
app.get('/test', (req, res, next) => {
    let name = req.query.username;
    let callback = req.query.selfNamedReplaceCallback
    let s1 = "{status: 1}"
    let s2 = `
        {
            status: 0,
            info: {
                name: "${name}",
                age: 24,
                sex: "girl",
                tel: "1522*******"
            }
        }
    `
    s1=callback+"("+s1+")"
    s2=callback+"("+s2+")"
    if(!name)return res.send(s1)
    res.send(s2)
}).listen(3000)

Axios

  • axios 是一个基于 promise 的 HTTP 库,能够用在浏览器和 node.js 中。
  • 从浏览器中竖立 XMLHttpRequests
  • 从 node.js 竖立 http 要求
  • 支撑 Promise API
  • 阻拦要乞降相应
  • 转换要求数据和相应数据
  • 作废要求
  • 自动转换 JSON 数据
  • 客户端支撑防备 XSRF

在vue项目中运用axios 的 Demo

// main.js
import axios from 'axios'
axios.defaults.baseURL = 'http://localhost/'
Vue.prototype.$axios = axios
// 在 .vue 文件(组件)
this.$axios.get("").then().catch()

this.$axios.all([
    this.$axios.post('one','content=123'),
    this.$axios.get('one?pageIndex=1')
])
.then(this.$axios.spread((res1,res2)=>{
    console.log(res1,res2)
}))
.catch(err=>{
    console.log(err)
})

这里分发要求,同时要求胜利才实行 then 要领,可用于猎取 省市区 的数据

// 在 server.js 文件
const Koa = require('koa')
const Router = require('koa-router')
const app = new Koa()
const router = new Router()
router.get('/one',ctx=>{
    ctx.body = {
        a: 1,
        b: 2
    }
})
router.post('/one',ctx=>{
    ctx.body = {
        c: 3,
        d: 4
    }
})

app.use((ctx,next)=>{
    ctx.set("Access-Control-Allow-Origin", "*");
    ctx.body = {}
    next()
})
.use(router.routes())
.use(router.allowedMethods())
.listen(80)
阻拦器
axios.interceptors.request.use(function(ops){
    console.log(ops);
    ops.headers = {/* ... */}; // 要求前修正
    return ops; // 返回没有修正的位置,假如return false 直接阻拦
})

比方,在要求胜利前显现加载loading图标,拿到数据后消逝

// main.js
import Mint from 'mint-ui' // 现实项目中挑选引入
import 'mint-ui/lib/style.css'
Vue.use(Mint)

axios.interceptors.request.use(function(config){
    Mint.Indicator.open()
    return config;
})
axios.interceptors.response.use(function(data){
    Mint.Indicator.close()
    return data;
})

Ajax、jQuery.ajax、Axios和Fetch的区分

  • ajax最早涌现的发送后端要求手艺,利用用XMLHttpRequest对象。
  • $.ajax是jQuery中的发送后端要求手艺,基于原生Ajax的封装。
  • Axios不是原生JS的,须要举行装置。它在client-side和server-side都能够运用。也能够在要乞降相应阶段举行阻拦。它是基于promise对象的。
  • Fetch号称是AJAX的替换品,运用了ES6中的promise对象。其参数有点像jQuery.ajax。然则fetch不是对ajax的封装,而是原生js完成的,并没有运用XMLHttpRequest对象。
    原文作者:落霞与孤鹜齐飞
    原文地址: https://segmentfault.com/a/1190000017487478
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞