JSONP跨域请求实例详解


Posted in Javascript onJuly 04, 2016

JSOP简介

JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。

跨域请求的方式有很多种:

1.iframe
2.document.domain
3.window.name
4.script
5.XDomainRequest (IE8+)
6.XMLHTTPRequest (Firefox3.5+)
7.postMessage (HTML5)
8.后台代理
9....

它们有各自的优缺点,返回的数据格式也各不同,应根据需求慎重选择。比如iframe返回html片段就比较适合,费老劲用它返回JSON就得不偿失了。这篇开始我将打造一个实用的跨域请求工具Sjax。使用script请求的最大缺点,挑战是错误处理。比如404错误,它不象XMLHTTPRequest能准确的返回状态码404。我把这个放在最后一篇。

本系列主要描述以上列举的方式4,即通过script返回JSON格式数据数据。这种方式现在称为JSONP。JSON是目前前后台沟通使用最流行,也最广泛的格式之一。相对于早期的AJAX返回XML(AJAX中的X就是XML),JSON显得更轻量级,没有多余的Tag标记,解析也是原生的。XML返回到前端后先转成文档,通过DOM API一层层的解析。解析DOM是开销比较大的,尤其在早期的IE版本中(IE6/7/8),core js与dom沟通的代价是很大的。

JSONP的实现思路很简单

1.前端创建script标记,设置src,添加到head中(你可以往body中添加)

2.后台返回一个js变量jsonp,这个jsonp就是请求后的JSON数据

3.回调完成后删除script标记(还有一些清理工作如避免部分浏览器内存泄露等)

接口

Sjax.load(
url, // 跨越请求的URL
success, // 回调函数,必须定义一个形参,用于接收后台返回的全局变量jsonp (约定后台返回如jsonp = {...}结构)
timestamp, // 传true会加一个时间戳,防止缓存,默认不加
);

示例:

<!DOCTYPE HTML>
<html> 
<head> 
<meta charset="utf-8"> 
<title>sjax_0.1.js by snandy</title>
<script src="http://files.cnblogs.com/snandy/sjax_0.1.js"></script>
</head> 
<body>
<p id="p1" style="background:gold;"></p>
<input type="button" value="Get Name" onclick="clk()"/>
<script type="text/javascript">
function clk(){
Sjax.load(
'http://files.cnblogs.com/snandy/jsonp.js', 
function(){
document.getElementById('p1').innerHTML = 'Hi, ' + jsonp.name;
}
); 
}
</script>
</body>
</html>

这个html实现一个最简单的前后台交互功能,点击按钮“Get Name”,获取到name后显示在段落P上。

clk函数中调用Sjax.load方法,Sjax中的S指script。之前我的Ajax系列中使用的Ajax命名,这里就使用了Sjax。

请求的后台url是jsonp.js,它返回如下

jsonp = {name:'jack'};

因为是测试,这里使用最简单的方式实现。请求的后台其实不必是js文件,可以是php,java等任何后台语言,它们可能会连接数据库进行一系列的业务查询。总之它最后返回的结构必须变量jsonp,这个变量就是一个js对象,至于有多复杂则无需关注。

以上所述是小编给大家介绍的JSONP跨域请求实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript 仿关机效果的图片层
Dec 26 Javascript
详解强大的jQuery选择器之基本选择器、层次选择器
Feb 07 Javascript
JavaScript中匿名函数用法实例
Mar 23 Javascript
JQuery中DOM事件冒泡实例分析
Jun 13 Javascript
JavaScript实现简洁的俄罗斯方块完整实例
Mar 01 Javascript
BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)
Jul 07 Javascript
Vue通过input筛选数据
Oct 26 Javascript
BootStrap TreeView使用实例详解
Nov 01 Javascript
详解使用VueJS开发项目中的兼容问题
Aug 02 Javascript
JavaScript中filter的用法实例分析
Feb 27 Javascript
vue 在服务器端直接修改请求的接口地址
Dec 19 Vue.js
JS Canvas接口和动画效果大全
Apr 29 Javascript
Bootstrap表单布局样式源代码
Jul 04 #Javascript
JS JSOP跨域请求实例详解
Jul 04 #Javascript
json格式的javascript对象用法分析
Jul 04 #Javascript
jQuery简单动画变换效果实例分析
Jul 04 #Javascript
Node.js Streams文件读写操作详解
Jul 04 #Javascript
jQuery文字提示与图片提示效果实现方法
Jul 04 #Javascript
jQuery实现的导航下拉菜单效果
Jul 04 #Javascript
You might like
DOTA2 无惧惊涛骇浪 昆卡大型水友攻略
2020/04/20 DOTA
用PHP和ACCESS写聊天室(七)
2006/10/09 PHP
destoon出现验证码不显示时的紧急处理方法
2014/08/22 PHP
PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)
2016/09/11 PHP
接收键盘指令的脚本
2006/06/26 Javascript
javascript 设置文本框中焦点的位置
2009/11/20 Javascript
JavaScript表格常用操作方法汇总
2015/04/15 Javascript
基于JavaScript制作霓虹灯文字 代码 特效
2015/09/01 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
2015/12/03 Javascript
jQuery中cookie插件用法实例分析
2015/12/04 Javascript
Boostrap栅格系统与自己额外定义的媒体查询的冲突问题
2017/02/19 Javascript
结合Vue控制字符和字节的显示个数的示例
2018/05/17 Javascript
vue的列表交错过渡实现代码示例
2019/05/05 Javascript
vue canvas绘制矩形并解决由clearRec带来的闪屏问题
2019/09/02 Javascript
VUE 组件转换为微信小程序组件的方法
2019/11/06 Javascript
[02:12]DOTA2英雄基础教程 变体精灵
2013/12/16 DOTA
python中getattr函数使用方法 getattr实现工厂模式
2014/01/20 Python
Python抓取电影天堂电影信息的代码
2016/04/07 Python
基于python指定包的安装路径方法
2018/10/27 Python
Python内置类型性能分析过程实例
2020/01/29 Python
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
HTML5如何使用SVG的方法示例
2019/01/11 HTML / CSS
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
澳大利亚当地社区首选的光学商店:1001 Optical
2019/08/24 全球购物
澳大利亚在线划船、露营和钓鱼商店:BCF Australia
2020/03/22 全球购物
天网面试题
2013/04/07 面试题
怎么写好自荐信
2013/10/30 职场文书
《水乡歌》教学反思
2014/04/24 职场文书
2014普法依法治理工作总结
2014/12/18 职场文书
四年级数学上册教学计划
2015/01/20 职场文书
新员工试用期自我评价
2015/03/10 职场文书
公司周年庆寄语
2019/06/21 职场文书
关于 Python json中load和loads区别
2021/11/07 Python
使用python创建股票的时间序列可视化分析
2022/03/03 Python
SQL Server的存储过程与触发器以及系统函数和自定义函数
2022/04/10 SQL Server
VMware虚拟机安装 Windows Server 2022的详细图文教程
2022/09/23 Servers