AJAX
AJAX是什么?
异步的JavaScript和XML
- 使用XMLHttpRequest发送请求
 - 服务器返回XML格式的字符串
 - JS解析XML,并更新局部页面
 
现在已经很少用XML,都在用JSON!
写一个简单的AJAX:
let request = new XMLHttpRequest();
request.open('GET','http://localhost:8001');
request.onreadystatechange = () => {
    if(request.readyState ===4){
        console.log('响应完毕');
        if(request.status => 200 && request.status < 300 || request.status === 304){
            console.log('请求成功');
            let string  = request.responseText;
            let objcet  = window.JSON.parse(string);
        }
    }else if(request.status >= 400){
        console.log('请求失败')
    }
}
request.send();
readyState 请求状态
有五种状态:
0 open()方法还未被调用.
1 send()方法还未被调用.
2 send()方法已被调用,响应头和响应状态已经返回.
3 响应体下载中;responseText中已获取了部分数据.
4 整个请求过程已经完毕.
request.status 返回请求的状态码
request.responseText 返回的字符串
JSON
JS VS JSON
- JSON 没有undefined和funtion
 - JSON 字符串的首尾必须是双引号””
 
具体对比
undefined      没有
null           null
[‘a’,’b’]      [“a”,”b”]
function(){}   没有
{name:’roxas’} {“name”:”roxas”}
‘roxas’        “roxas”
var a = {}
a.self  = a    搞不定(没有变量)
{proto}    没有原型链
JS使用JSON
一个JSON对象
{
    "notes":{
        "from":"roxas",
        "to":"养蛇",
        "title":"打招呼",
        "contant":"你好"
    }
}
JS代码使用JSON
let request = new XMLHttprequest();
request.open('GET','URL')  //配置request
request.onreadystatechange = ()=>{
    if(request.readyState === 4) {
        if(request.status >= 200 && request.status <300 || request.status === 304){
            let string = request.responseText;
            // 把符合 JSON 语法的字符串转换成JS对应的值
            let object = window.JSON.parse(string);
            console.log(object);
        }esle if(request.status >= 400){
            console.log('说明请求失败');
        }
    }
}
request.send();
后端代码
else if(path==='url'){
    response.statusCode = 200
    response.setHeader('Content-Type', 'text/json;charset=utf-8')
    response.setHeader('Access-Control-Allow-Origin', 'http://localhsot:8001')
    response.write(`
    {
    "notes":{
        "from":"roxas",
        "to":"养蛇",
        "title":"打招呼",
        "contant":"你好"
        }
    }
    `)
    response.end()
同源策略
只有 协议+端口+域名 一模一样才允许发 AJAX 请求
例:
http://baidu.com 可以向 http://www.baidu.com 发 AJAX 请求吗 no
http://baidu.com:80 可以向 http://baidu.com:81 发 AJAX 请求吗 no
CORS可以告诉浏览器,我俩一家的,别阻止他
CORS:Cross-Origin Resource Sharing(跨源资源共享)
响应的服务器(8001)代码加入响应头:
response.setHeader('Access-Control-Allow-Origin', 'http://localhsot:8002')
AJXA获取请求与响应的所有信息
请求:
POST / HTTP/1.1
HOST: localhost:8001
Content-Type:application/x-www-url-encoded
a=1&b=2
第一部分:
request.open('POST','http://localhost:8001')
第二部分:
request.setHeader('Content-Type','x-www-form-urlencoded')
第四部分:
request.send('a=1&b=2')
响应:
HTTP/1.1 200 OK
Content-Type: text/html
<!DOCTYPE html>
<html>...</html>
第一部分:
request.status //200
request.statusText //OK
第二部分:
request.getResponseHeader() //获得值
或
request.getResponseHeaders() //获得hash
第四部分:
request.responseText
回调函数
函数用参数是一个函数,参数名字为callback
call a function
call a function  back
callback
callback === function
ES6语法 解构赋值
ES5
let method = options.method;
let body = options.body;
let successFn = options.successFn;
let failFn = options.failFn;
let headers = options.headers;
ES6
let {method,body,successFn,failFn,headers} = option
封装jQuery.ajax
// 选择器,不用看
var jQuery = function(nodeOrSelector){
    let nodes = {}
    if(typeof nodeOrSelector === 'string'){
        let temp = document.querySelectorAll(nodeOrSelector);
        for(let i = 0;i<temp.length;i++){
            nodes[i] = temp[i]
        }
        nodes.length = temp.length;
    }else if(nodeOrSelector instanceof Node){
        nodes = {
            0:nodeOrSelector,
            length:1
        }
    }
    return {
        addClass:function(){},
        setText:function(){}
    }
}
window.jQuery = jQuery;
window.$ = jQuery;
//以下为ajxa代码
window.jQuery.ajax = function({url,method,body,headers}){
    return new Promise(function(resolve,reject){
        let request = new XMLHttprequest();
        request.open(method,url);
        for(let key in headers){
            let value = headers[key];
            request.setRequestHeader(key,value)
        }
        request.onreadystatechange = ()=>{
            if(request.readystates === 4){
                if(request.status >= 200 && request.status < 300){
                    resolve.call(undefined,request.responseText);
                }else if(request.status >= 400){
                    reject.call(undefined,request)
                }
            }
        }
        request.send(body);
    })
}
Promise
return new Promise (function(resolve,reject){})
function xxx(){
    return new Promise((f1,f2)=>{
        doSometing();
        setTimeout(()=>{
            //成功就调用f1,失败就调用f2
        },3000)
    })
}
xxx().then(success,fail);
//链式操作
xxx().then(success,fail).then(success,fail);
版权声明:本博客所有文章除特殊声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明出处 Roxas Deng的博客!