JSONP

局部刷新怎么做?

有没有想过,不返回 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()
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. JSONP的实现原理 JSONP是通过动态创建script实现的。请求方:frank.com 的前端程序员(...
    王童孟阅读 491评论 0 2
  • JSONP 问:什么是JSONP? 1. 问题引入 在日常开发中,前端程序员想要从后端请求一些数据,是如何操作的呢...
    黄同学2019阅读 430评论 0 2
  • 前端操作数据库 首先,我们试着通过前端来操作一个数据库。数据库是什么?只要能长久的存数据,就是数据库。文件系统是一...
    是刘快啊阅读 393评论 0 2
  • 本系列文章来源: https://blog.ansheng.me/article/python-full-stac...
    码农小杨阅读 445评论 0 0
  • Lp28的承诺:一个都不能少 同学们通过各种方式支持同学!这才是Lp28的精神 世位同学苦口婆心的劝说 此刻感受到...
    寒冰22阅读 596评论 1 0