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 相关文章推荐
jQuery 美元符冲突的解决方法
Mar 28 Javascript
初识javascript 文档碎片
Jul 13 Javascript
写自已的js类库需要的核心代码
Jul 16 Javascript
Jquery时间验证和转换工具小例子
Jul 01 Javascript
jQuery遍历Form示例代码
Sep 03 Javascript
jQuery.event兼容各浏览器的event详细解析
Dec 18 Javascript
JS判断浏览器是否支持某一个CSS3属性的方法
Oct 17 Javascript
根据配置文件加载js依赖模块
Dec 29 Javascript
JS动态显示表格上下frame的方法
Mar 31 Javascript
Vue resource中的GET与POST请求的实例代码
Jul 21 Javascript
jQuery+ajax读取json数据并按照价格排序示例
Mar 28 jQuery
js 将多个对象合并成一个对象 assign方法的实现
Sep 24 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
PHP JSON 数据解析代码
2010/05/26 PHP
PHP操作数组相关函数
2011/02/03 PHP
优化PHP代码技巧的小结
2013/06/02 PHP
计算php页面运行时间的函数介绍
2013/07/01 PHP
php递归删除目录下的文件但保留的实例分享
2014/05/10 PHP
PHP使用GIFEncoder类生成gif动态滚动字幕
2014/07/01 PHP
PHP+MySQL插入操作实例
2015/01/21 PHP
功能强大的php文件上传类
2016/08/29 PHP
使用PHP连接数据库_实现用户数据的增删改查的整体操作示例
2017/09/01 PHP
js资料prototype 属性
2007/03/13 Javascript
简易js代码实现计算器操作
2013/04/15 Javascript
node.js中的path.normalize方法使用说明
2014/12/08 Javascript
javascript结合canvas实现图片旋转效果
2015/05/03 Javascript
异步安全加载javascript文件的方法
2015/07/21 Javascript
Node.js与MySQL交互操作及其注意事项
2016/10/05 Javascript
ES6新特性:使用export和import实现模块化详解
2017/07/31 Javascript
Angular2+如何去除url中的#号详解
2017/12/20 Javascript
小程序测试后台服务的方法(ngrok)
2019/03/08 Javascript
webpack优化之代码分割与公共代码提取详解
2019/11/22 Javascript
Vue实现星级评价效果实例详解
2019/12/30 Javascript
Vue两个版本的区别和使用方法(更深层次了解)
2020/02/16 Javascript
在VUE style中使用data中的变量的方法
2020/06/19 Javascript
vue数据更新UI不刷新显示的解决办法
2020/08/06 Javascript
用Python进行TCP网络编程的教程
2015/04/29 Python
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
浅析Python的Django框架中的Memcached
2015/07/23 Python
Python实现对特定列表进行从小到大排序操作示例
2019/02/11 Python
python 画出使用分类器得到的决策边界
2019/08/21 Python
Python库skimage绘制二值图像代码实例
2020/04/10 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
2020/05/28 Python
TensorFlow中如何确定张量的形状实例
2020/06/23 Python
Lululemon英国官网:加拿大瑜伽服装品牌
2019/01/14 全球购物
如何整合JQuery和Prototype
2014/01/31 面试题
2015财务年终工作总结范文
2015/05/22 职场文书
导游词之沈阳植物园
2019/11/30 职场文书
python 模拟在天空中放风筝的示例代码
2021/04/21 Python