前端人员必须会的jsonp!

本文介绍了浏览器的同源策略及其限制,解释了JSONP(JSON with Padding)的工作原理,作为解决跨域问题的一种方式。通过创建script标签并动态设置src属性,将数据包装在预先定义的回调函数中,使得数据可以从其他域下获取并执行。文章还提供了一个简单的JSONP封装函数示例,展示了如何使用JSONP进行跨域数据请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

同源策略(Same origin Policy)

浏览器出于安全方面的考虑,只允许与同域下的接口交互。

同域指的是?

同协议:如都是http或者https
同域名:如都是http://jirengu.com/ahttp://jirengu.com/b
同端口:如都是80端口
比如: 用户打开了 页面: http://jirengu.com/blog, 当前页面下的 js 向 http://jirengu.com/xxx 的接口发 ajax 请求,浏览器是允许的。但假如向: http://hunger-valley.com/xxx 发ajax请求则会被浏览器阻止掉,因为存在跨域调用。

「原来如此,怪不得浏览器会报错。跨域不过如此嘛!那 JSONP是什么呢?」

HTML 中 script 标签可以加载其他域下的js,比如我们经常引入一个其他域下线上cdn的jQuery。那如何利用这个特性实现从其他域下获取数据呢?

可以先这样试试:

这时候会向天气接口发送请求获取数据,获取数据后做为 js 来执行。 但这里有个问题, 数据是 JSON 格式的数据,直接作为 JS 运行的话我如何去得到这个数据来操作呢? 这样试试: 这个请求到达后端后,后端会去解析callback这个参数获取到字符串showData,在发送数据做如下处理: 之前后端返回数据: {“city”: “hangzhou”, “weather”: “晴天”} 现在后端返回数据: showData({“city”: “hangzhou”, “weather”: “晴天”}) 前端script标签在加载数据后会把 「showData({“city”: “hangzhou”, “weather”: “晴天”})」做为 js 来执行,这实际上就是调用showData这个函数,同时参数是 {“city”: “hangzhou”, “weather”: “晴天”}。 用户只需要在加载提前在页面定义好showData这个全局函数,在函数内部处理参数即可。 function showData(ret){ console.log(ret); }

「原来这就是 JSONP(JSON with padding),总结一下:」
1. JSONP是通过 script 标签加载数据的方式去获取数据当做 JS 代码来执行

  1. 提前在页面上声明一个函数,函数名通过接口传参的方式传给后台,后台解析到函数名后在原始数据上「包裹」这个函数名,发送给前端。换句话说,JSONP 需要对应接口的后端的配合才能实现。
    [封装jsonp]
    function jsonp(setting){
    setting.data = setting.data || {}
    setting.key = setting.key||’callback’
    setting.callback = setting.callback||function(){}
    setting.data[setting.key] = ‘onGetData

    window.onGetData = function(data){
    setting.callback (data);
    }

    var script = document.createElement(‘script’)
    var query = []
    for(var key in setting.data){
    query.push( key + ‘=’+ encodeURIComponent(setting.data[key]) )
    }
    script.src = setting.url + ‘?’ + query.join(‘&’)
    document.head.appendChild(script)
    document.head.removeChild(script)

}

jsonp({
url: ‘http://api.jirengu.com/weather.php‘,
callback: function(ret){
console.log(ret)
}
})
jsonp({
url: ‘http://photo.sina.cn/aj/index‘,
key: ‘jsoncallback’,
data: {
page: 1,
cate: ‘recommend’
},
callback: function(ret){
console.log(ret)
}
})

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值