借助script进行Http跨域请求:JSONP实现原理及代码

 更新时间:2013年03月19日 14:51:09   作者:  
script元素的src属性能设置URL并发起HTTP GET请求实现脚本操作HTTP可以跨域通信而不受限与同源策略,接下来为大家详细介绍下Http跨域请求实现,感兴趣的你可以参考下哈
<script>元素的src属性能设置URL并发起HTTP GET请求, 使用<script>元素实现脚本操作HTTP可以跨域通信而不受限与同源策略. 通常, 使用基于<script>的Ajax传输协议时, 服务器响应采用JSON编码的数据格式, 当执行脚本时候, JavaScript解析器能够自动将其解码. 由于它使用JSON数据格式, 因此这种Ajax传输协议也叫做"JSONP". 所以使用jsonp技术, 只需要设置<script>的src属性, 并且插入到document中, 然后浏览器就会发送一个http请求以下载src属性所执行的url.

当使用<script>元素调用数据时, 响应内容必须用JavaScript函数名和圆括号包裹起来(也就是只能作为函数的参数), 而不是直接的一段json数据:
复制代码 代码如下:

response(
[1, 2, {"hello", "world"}]
)

为了可行期间, 我们必须通过某种方式告诉服务, 它正在从一个<script>元素调用, 必须返回一个jsonp响应, 而不是普通的json, 这个可以通过在url中添加一个查询参数来实现: 例如, 追加"?json"(或者&json)

在实践中, 支持jsonp的服务不会强制指定客户端必须实现的回调函数名称, 比如response. 相反它们使用查询参数的值, 允许客户端指定一个函数名,然后使用函数名去填充响应.
复制代码 代码如下:

//根据指定的url发送一个json请求
//然后把解析得到的响应数据传递给回调函数
//在url中添加一个名为jsonp的查询参数, 用于指定该请求的回调函数的名称
function getJSONP(url, callback){
//为本次请求创建一个唯一的回调函数名称
var cbnum = "cb"+getJSONP.counter++;
var cbname = "getJSONP."+cbnum; //作为jsonp函数的属性
//将回调函数名称以表单编码的形式添加到url查询部分中
if(url.indexOf("?") === -1){
url += "?jsonp="+cbname;
}else{
url += "&jsonp="+cbname;
}
//创建<script>用于发送请求
var script = document.createElement("script");
//定义被脚本执行的回调函数
getJSONP[cbnum] = function(response){
try{
callback(response); //处理响应
}
finally{
//删除该函数, 并移除相应script元素
delete getJSONP[cbnum];
script.parentNode.removeChild(script);
}
}
//立即触发http请求
script.src = url;
document.body.appendChild(script);
}
getJSONP.counter = 0;

相关文章

  • 信息滚动效果的实例讲解

    信息滚动效果的实例讲解

    下面小编就为大家带来一篇信息滚动效果的实例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 微信小程序自动化部署的全过程

    微信小程序自动化部署的全过程

    由于微信小程序需要在微信小程序助手上发布,比较麻烦,可以配置CI 自动化的发布,下面这篇文章主要给大家介绍了关于微信小程序自动化部署的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • 详解webpack-dev-server 设置反向代理解决跨域问题

    详解webpack-dev-server 设置反向代理解决跨域问题

    后端只负责接口,前端负责数据展示、逻辑处理。那么如何跨域?这篇文章主要介绍了webpack-dev-server 设置反向代理解决跨域问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • 查看QQ是否在线状态的网页代码

    查看QQ是否在线状态的网页代码

    这个其实就是利用qq官方提供的东西,简单的通过图片来测试是否在线,隐身也是不在线状态。纯粹学习使用。
    2010-04-04
  • 原生js封装添加class,删除class的实例

    原生js封装添加class,删除class的实例

    下面小编就为大家带来一篇原生js封装添加class,删除class的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望对大家有所帮助
    2017-11-11
  • JavaScript Date对象详解及时间戳和时间的相互转换问题

    JavaScript Date对象详解及时间戳和时间的相互转换问题

    这篇文章主要介绍了JavaScript Date对象详解及时间戳和时间的相互转换问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • JS端基于download.js实现图片、视频时直接下载而不是打开预览

    JS端基于download.js实现图片、视频时直接下载而不是打开预览

    这篇文章主要介绍了JS端基于download.js实现图片、视频时直接下载而不是打开预览,需要的朋友可以参考下
    2020-05-05
  • 原生js仿jquery实现对Ajax的封装

    原生js仿jquery实现对Ajax的封装

    大家都知道jquery在我们日常开发中的使用频率非常高,但jquery说到底还是对js的封装,我们不能光会使用,只有知道了其中的远离才能更好的使用,所以这篇文章主要介绍的是原生js仿jquery实现对Ajax封装的方法。
    2016-10-10
  • JavaScript作用域深度剖析之动态作用域

    JavaScript作用域深度剖析之动态作用域

    这篇文章主要为大家介绍了 JavaScript作用域学习之动态作用域深度剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 理解JavaScript表单的基础知识

    理解JavaScript表单的基础知识

    这篇文章主要带领大家理解JavaScript表单的基础知识,对javascript表单脚本进行深入学习,感兴趣的小伙伴们可以参考一下
    2016-01-01

最新评论