Ajax
如何发请求?
用 form 可以发请求,但是会刷新页面或新开页面
用 a 可以发 get 请求,但是也会刷新页面或新开页面
用 img 可以发 get 请求,但是只能以图片的形式展示
用 link 可以发 get 请求,但是只能以 CSS、favicon 的形式展示
用 script 可以发 get 请求,但是只能以脚本的形式运行
有没有什么方式可以实现:
- 
    
get、post、put、delete 请求都行
 - 
    
想以什么形式展示就以什么形式展示
 
有!这就是今天要讲的 Ajax。
同源策略
只有 协议+端口+域名 一模一样才允许发 AJAX 请求
http://baidu.com 不可以向 http://www.baidu.com 发 AJAX 请求
http://baidu.com:80 不可以向 http://baidu.com:81 发 AJAX 请求
浏览器必须保证只有 协议+端口+域名 一模一样才允许发 AJAX 请求
但 CORS 可以告诉浏览器,我俩一家的,别阻止他
Ajax 可以设置任意请求 header
第一部分:request.open(‘get’,’/xxx’)
第二部分:request.setHeader(‘content-type’,’x-www-form-urlencoded’)
第四部分:request.send(‘a=1&b=2’)
Ajax 可以获取任意响应 header
第一部分:request.status / request.statusText
第二部分:request.getResponseHeader() / request.getAllResponseHeaders()
第四部分:request.respondText
Ajax
Ajax 示例:
let request = new XMLHttpRequest()
request.open('get', '/xxx')
request.send()
request.onreadystatechange = ()=>{
    if(request.readyState === 4){ 
        if(request.status >= 200 && request.status < 300){
            console.log('说明请求成功')
        }else if(request.status >= 400){
            console.log('说明请求失败') 
        }
    }
}
自制 jQuery.Ajax
window.jQuery.ajax = (url, method, body, success, fail)=>{
    let request = new XMLHttpRequest()
    request.open(method, url)
    request.send(body)
    request.onreadystatechange = ()=>{
        if(request.readyState === 4){
            if(request.status === 200){
                success.call(undefined,request.statusText)
            }else{
                fail.call(undefined,request.statusText)
            }
        }
    }
}
function success(e){
    console.log(e)
}
function fail(e){
    console.log(e)
}
myButton.addEventListener('click', ()=>{
    jQuery.ajax('/xxx','get',null,success,fail)
})
自制 jQuery.Ajax( Promise 版本)
回调的问题是每个程序员的回调名不一样
Promise 解决了这个问题
Promise 示例:
function xxx(){
    return new Promise((f1, f2) => {
        doSomething()
        setTimeout(()=>{
            // 成功就调用 f1,失败就调用 f2
        },3000)
    })
}
xxx().then(success, fail)
// 链式操作
xxx().then(success, fail).then(success, fail)
自制 jQuery.Ajax( Promise 版本):
window.jQuery.ajax = ({url, method, body})=>{
    return new Promise(function(resolve, reject){
        let request = new XMLHttpRequest()
        request.open(method, url)
        request.send(body)
        request.onreadystatechange = ()=>{
            if(request.readyState === 4){
                if(request.status === 200){
                    resolve.call(undefined,request.statusText)
                }else{
                    reject.call(undefined,request.statusText)
                }
            }
        }
    })
}
function success(e){
    console.log(e)
}
function fail(e){
    console.log(e)
}
myButton.addEventListener('click', ()=>{
    jQuery.ajax({
        url:'/xxx',
        method:'get'
    }).then(success,fail)
})