原理
JSONP is a method for sending JSON data without worrying about cross-domain issues. JSONP does not use the
XMLHttpRequestobject. JSONP uses the<script>tag instead. 就是说jsonp就是一个发送json数据,而不用担心跨域问题的技术方法。
他不会使用XMLHttpRequest对象,而是利用了script标签src属性没有跨域限制的特性。
由于标签属性src的限制,jsonp只能够进行get请求
使用
- 前后端商量好一个回调函数
cb,并在前端声明定义 - 后端发送数据时,解析出回调函数,用回调函数,如
cb包裹住要发送的数据,如res.end(cb+'({})') - 前端新建一个
script标签,并将请求地址与调用参数拼接成URL,如http://localhost:3000?callback=cb,并赋值给script标签的src属性 script标签请求到数据以后,会自动执行前端定义的回调函数cb
代码
简单实现一下,服务端用node编写。
client.html
<body>
<script>
let script = document.createElement('script')
//2.拼接src,get到数据后将会自动执行回到函数cb(data)
script.src = "http://localhost:3000?callback=cb"
document.body.appendChild(script)
</script>
<script>
//1.协调后端,确定回调函数,定义回调函数
function cb(obj){
setTimeout(()=>{
//如果 `document.write()` 调用发生在 HTML 里的 `<script>` 标签中,
//那么它将不会自动调用,需要一个宏任务等待获取到数据
document.write(`key:${Object.keys(obj)},value:${Object.values(obj)}`)
})
}
</script>
</body>
server.js
const http = require('http')
const url = require('url')
let count = 0
const server = http.createServer()
server.on('request', (req, res) => {
const param = url.parse(req.url).query.split('=')//["callback","cb"]
let callback = param[1]
console.log("请求",++count);
res.end(callback+'({"name":"zhangsan"})')//发送cb({data})
})
server.listen(3000, () => {
console.log("3000端口监听中")
})
结果