JSONP

作者: 加油吧_ | 来源:发表于2018-06-10 01:37 被阅读8次

    局部刷新怎么做?

    有没有想过,不返回 HTML,返回 JS

    方案一:用图片造 get 请求

    button.addEventListener('click', (e)=>{
        let image = document.createElement('img')
        image.src = '/pay'
        image.onload = function(){ // 状态码是 200~299 则表示成功
            alert('成功')
        }
        image.onload = function(){ // 状态码大于等于 400 则表示失败
            alert('失败')
        }
    })
    
    

    方案二:用 script 造 get 请求

    button.addEventListener('click', (e)=>{
        let script = document.createElement('script')
        script.src = '/pay'
        document.body.appendChild(script)
        script.onload = function(e){ // 状态码是 200~299 则表示成功
            e.currentTarget.remove()
        }
        script.onload = function(e){ // 状态码大于等于 400 则表示失败
            e.currentTarget.remove()
        }
    })
    
    
    //后端代码
    ...
    if (path === '/pay'){
        let amount = fs.readFileSync('./db', 'utf8')
        amount -= 1
        fs.writeFileSync('./db', amount)
        response.setHeader('Content-Type', 'application/javascript')
        response.write('amount.innerText = ' + amount)
        response.end()
    }
    ...
    
    

    这种技术叫做 SRJ - Server Rendered JavaScript

    跨域 SRJ

    确定函数名

    JSONP

    请求方:frank.com 的前端程序员(浏览器)
    响应方:jack.com 的后端程序员(服务器)

    1. 「请求方」创建 script,src 指向「相应方」,同时传一个查询参数 ?callbackName=yyy
    2. 「相应方」根据查询参数callbackName,构造形如
      1. yyy.call(undefined, '你要的数据')
      2. yyy('你要的数据')
        这样的响应
    3. 「请求方」接收到响应,就会执行 yyy.call(undefined, '你要的数据')
      yyy 是在前端代码里写好的函数
    4. 那么「请求方」就可以得到他要的数据,以及得到想要的结果

    这就是 JSONP

    方案3:JSONP

    button.addEventListener('click', (e)=>{
        let script = document.createElement('script')
        let functionName = 'frank'+ parseInt(Math.random()*10000000 ,10)
        window[functionName] = function(){  // 每次请求之前搞出一个随机的函数
            amount.innerText = amount.innerText - 0 - 1
        }
        script.src = '/pay?callback=' + functionName
        document.body.appendChild(script)
        script.onload = function(e){ // 状态码是 200~299 则表示成功
            e.currentTarget.remove()
            delete window[functionName] // 请求完了就干掉这个随机函数
        }
        script.onload = function(e){ // 状态码大于等于 400 则表示失败
            e.currentTarget.remove()
            delete window[functionName] // 请求完了就干掉这个随机函数
        }
    })
    
    
    //后端代码
    ...
    if (path === '/pay'){
        let amount = fs.readFileSync('./db', 'utf8')
        amount -= 1
        fs.writeFileSync('./db', amount)
        let callbackName = query.callback
        response.setHeader('Content-Type', 'application/javascript')
        response.write(`
            ${callbackName}.call(undefined, 'success')
        `)
        response.end()
    }
    ...
    
    

    约定:

    1. callbackName -> callback

    2. yyy -> 随机数 frank12312312312321325()

       $.ajax({
       url: "http://jack.com:8002/pay",
       dataType: "jsonp",
       success: function( response ) {
           if(response === 'success'){
           amount.innerText = amount.innerText - 1
           }
       }
       })
      
       $.jsonp()
      

    相关文章

      网友评论

          本文标题:JSONP

          本文链接:https://www.haomeiwen.com/subject/tuaxeftx.html