• 关于AJAX


    一些发请求的方法

    用 form 可以发请求,但是会刷新页面或新开页面
    用 a 可以发 get 请求,但是也会刷新页面或新开页面
    用 img 可以发 get 请求,但是只能以图片的形式展示
    用 link 可以发 get 请求,但是只能以 CSS、favicon 的形式展示
    用 script 可以发 get 请求,但是只能以脚本的形式运行(JSONP

    用AJAX发请求

    什么是AJAX?  —— 异步的 JavaScript 和 XML

    主要分为三步

    1. 使用XMLHttpRequest发请求
    2. 服务器返回XML格式的字符串
    3. JS解析XML,并更新局部页面(目前用JSON替代XML)

    示例代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    <body>
        <button id="btn">点击</button>
        <script src="./main.js"></script>
    </body>
    </html>
    btn.addEventListener('click', (e) => {
        //第一步:使用XMLHttpRequest发请求
        let request = new XMLHttpRequest()
        //配置request,初始化一个请求
        request.open('GET', '/xxx')
        //发送请求
        request.send()
        //监听请求的状态
        request.onreadystatechange = () => {
            if (request.readyState === 4) { //,4表示请求响应都完毕
                if (request.status >= 200 && request.status < 300) {
                    console.log('请求成功')
                    let string=request.responseText
                  //第三步:把符合JSON语法的字符串转换成JS对应的值
                    let object=JSON.parse(string)
                } else if (request.status >= 400) {
                    console.log('请求失败')
                }
            }
        }
        
    })            
    /********后端代码************/
    
        if (path === '/') {
            let string = fs.readFileSync('./index.html', 'utf8')
            response.statusCode = 200
            response.setHeader('Content-Type', 'text/html;charset=utf-8')
            response.write(string)
            response.end()
        } else if (path === '/main.js') {
            let string = fs.readFileSync('./main.js', 'utf8')
            response.statusCode = 200
            response.setHeader('Content-Type', 'text/javascript;charset=utf-8')
            response.write(string)
            response.end()
        } else if (path === '/xxx') {
            response.statusCode = 200
            response.setHeader('Content-Type', 'text/json;charset=utf-8')
            //第二步:服务器返回XML格式的字符串(这里用JSON替代XML)
            response.write(`
       {
           "note":{
               "to": "今天",
               "from": "明天",
               "heading": "每一天", 
               "content": "天天"
           }
       }
            `)
            response.end()
        }
        else {
            response.statusCode = 404
            response.setHeader('Content-Type', 'text/html;charset=utf-8')
            response.write('错误')
            response.end()
        }
    
        /*********后端代码***********/

    注意:

    • 通过AJAX,JS 可以设置任意请求 header 

        第一部分 request.open('get', '/xxx')
        第二部分 request.setRequestHeader('content-type','x-www-form-urlencoded')
        第四部分 request.send('a=1&b=2')

    • 通过AJAX,JS 可以获取任意响应 header 

        第一部分 request.status / request.statusText
        第二部分 request.getResponseHeader() / request.getAllResponseHeaders()
        第四部分 request.responseText

    关于JSON

    参考链接

    JSON是一门新语言,是一种数据格式化语言

    JS和JSON的区别

    JSON没有7种数据类型中的function和undefined

    JSON的字符串首尾必须是双引

    具体如下表:

     

    JS JSON
    undefined
    null null
    ['a','b'] ["a","b"]
    function fn (){}
    {name:'frank'} {"name":"frank"}
    'frank' "frank"

    var a={}

    a.self=a

    无变量
    {__proto__} 没有原型链

      

     

    关于同源策略

    浏览器必须保证:

    协议+端口+域名 一模一样才允许发AJAX请求,有限制,但是安全

    突破同源策略(CORS跨域)

     Cross-Origin Resource Sharing  跨栈资源共享

    示例代码:

    //发起请求
    request.open('GET', 'http://jerry.com:8002/xxx')
    //后台添加
    response.setHeader('Access-Control-Allow-Origin','http://tom.com:8001')

    封装AJAX

    初封装

    window.$=window.jQuery
    
    $.ajax=function(options){
        let url=options.url
        let method=options.method
        let body=options.body
        let successFn=options.successFn
        let failFn=options.failFn
        let headers=options.headers
    
        //第一步:使用XMLHttpRequest发请求
        let request = new XMLHttpRequest()
        request.open(method, url)//配置request,初始化一个请求
        for(let key in headers){
            let value=headers[key]
            request.setRequestHeaders(key,value)
    }
        request.send(body)//发送请求
        //监听请求的状态
        request.onreadystatechange = () => {
            if (request.readyState === 4) { //4表示请求响应都完毕
                if (request.status >= 200 && request.status < 300) {
                    successFn.call(undefined,request.responseText)
                } else if (request.status >= 400) {
                    failFn.call(undefined,request.responseText)
                }
            }
        }
    }
    
    //**********使用**************
    
    btn.addEventListener('click', (e) => {
        $.ajax({
            url:'/xxx',
            method:'POST',
            headers:{
                'content-typw':'application/x-www-form-urlencoded',
                'today':'18'
    }
            body:'a=1&b=2',
            successFn:(responseText) => {console.log(1)},
            failFn:(request) => {console.log(2)}
        })
    })    

    若接收两种参数

    ..........
    
    $.ajax=function(options){
        let url
        if (arguments.length===1){
            url=options.url
    }else if (arguments.length===2){
            url=arguments[0]
            options=arguments[1]
    }
        let url=options.url
        let method=options.method
        let body=options.body
        let successFn=options.successFn
        let failFn=options.failFn
        let headers=options.headers
    
    ..........

    若请求响应成功后要执行两个函数

    //**********使用**************
    
    function f1(responseText){}
    function f1(responseText){}
    
    btn.addEventListener('click', (e) => {
        $.ajax({
            url:'/xxx',
            method:'POST',
            body:'a=1&b=2',
            successFn:(x) => {
                f1.call(undefined,x)
                f2.call(undefined,x)
    },
            failFn:(request) => {console.log(2)}
        })
    })

    **举例解释ES6 解构赋值**

    var a = 'a'
    var b = 'b'
    [a,b]=[b,a]
    a//"b"
    b//"a" //将b赋值给a,将a赋值给b

    封装优化

    window.$=window.jQuery
    
    $.ajax=function({url,method,body,headers}){//ES6 解构赋值
        return new Promise(function(resolve,reject){
        let request = new XMLHttpRequest()
        request.open(method, url)//配置request
        for(let key in headers){
            let value=headers[key]
            request.setRequestHeaders(key,value)
    }
        //监听请求的状态
        request.onreadystatechange = () => {
            if (request.readyState === 4) { //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)
    })
    }
    
    
    //*********使用***********
    
    btn.addEventListener('click', (e) => {
        $.ajax({
            url:'/xxx',
            method:'get',
            headers:{
                'content-type':'application/x-www-form-urlencoded',
                'today':'18'
    }
        }).then(
            (text) => {console.log(text)},
            (request) => {console.log(request)}
    )
    })

    使用jQuery.ajax——Promise 

    参考资料

    promise是确实能够函数形式的规范

    btn.addEventListener('click', (e) => {
        $.ajax({
            url:'/xxx',
            method:'GET',
        }).then(
            (responseText) => {console.log(responseText)},//成功
          //console.log(responseText)的结果是个对象,因为此时响应的Content-Type是text/json,jQuery会自动将字符串转换成对象
    (request) => {console.log(error)}//失败 ) })

    如果要对一个结果进行多次处理

    btn.addEventListener('click', (e) => {
        $.ajax({
            url:'/xxx',
            method:'GET',
    }).then(
            (responseText) => {console.log(responseText),},//成功
            (request) => {console.log(error)}//失败
    ).then(
        (上次处理的结果) => {
            console.log(上一次的处理结果)
        },
          (request) => {console.log(error)}
    )
    })

    了解Axios

    Axios是Ajax的一个库,其区别在:

    1.比jquery.ajax功能多

    2.除了ajax功能外,没有其他功能,因为专一所以专注。

    Lern it.

    Example

    待补充..........

  • 相关阅读:
    [HDOJ3523]Image copy detection
    [HDOJ3526]Computer Assembling
    Ubuntu12.04 配置步骤
    const 详解
    ubuntu 12.04 源
    函数参数和数据成员同名
    友元
    静态数据 成员和静态函数
    成员指针
    内存泄露
  • 原文地址:https://www.cnblogs.com/BUBU-Sourire/p/11200702.html
Copyright © 2020-2023  润新知