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 相关文章推荐
QQ登录简单实现代码
Mar 09 Javascript
优秀js开源框架-jQuery使用手册(1)
Mar 10 Javascript
IE下使用cloneNode注意事项分享
Nov 22 Javascript
js+HTML5实现视频截图的方法
Jun 16 Javascript
JavaScript中利用Array和Object实现Map的方法
Jul 27 Javascript
jQuery实现仿腾讯视频列表分页效果的方法
Aug 07 Javascript
jquery通过name属性取值的简单实现方法
Jun 20 Javascript
AngularJS使用ng-options指令实现下拉框
Aug 23 Javascript
详解vue父子模版嵌套案例
Mar 04 Javascript
jquery拼接ajax 的json和字符串拼接的方法
Mar 11 Javascript
node.js爬虫爬取拉勾网职位信息
Mar 14 Javascript
jQuery实现简单的回到顶部totop功能示例
Oct 16 jQuery
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里面的抽象类
2010/01/28 PHP
php分页函数完整实例代码
2014/09/22 PHP
javascript基础的动画教程,直观易懂
2007/01/10 Javascript
Firefox div高度自适应
2009/04/28 Javascript
jQuery 源码分析笔记(7) Queue
2011/06/19 Javascript
使用Grunt.js管理你项目的应用说明
2013/04/24 Javascript
文本有关的样式和jQuery求对象的高宽问题分别说明
2013/08/30 Javascript
jQuery中delegate与on的用法与区别示例介绍
2013/12/20 Javascript
动态加载iframe时get请求传递中文参数乱码解决方法
2014/05/07 Javascript
用js模拟struts2的多action调用示例
2014/05/19 Javascript
IE下使用jQuery重置iframe地址时内存泄露问题解决办法
2015/02/05 Javascript
JavaScript中Date.toSource()方法的使用教程
2015/06/12 Javascript
Highcharts 多个Y轴动态刷新数据的实现代码
2016/05/28 Javascript
JavaScript中自带的 reduce()方法使用示例详解
2016/08/10 Javascript
基于jQuery实现的查看全文功能【实用】
2016/12/11 Javascript
Jquery Easyui表单组件Form使用详解(30)
2016/12/19 Javascript
关于页面刷新vuex数据消失问题解决方案
2017/07/03 Javascript
微信小程序实现轮播图效果
2017/09/07 Javascript
基于jQuery实现无缝轮播与左右点击效果
2018/05/13 jQuery
解决vue中监听input只能输入数字及英文或者其他情况的问题
2018/08/30 Javascript
使用element-ui的el-menu导航选中后刷新页面保持当前选中状态
2019/07/19 Javascript
vue3.0 的 Composition API 的使用示例
2020/10/26 Javascript
vuex的使用和简易实现
2021/01/07 Vue.js
[01:08]DOTA2次级职业联赛 - Shield战队宣传片
2014/12/01 DOTA
[38:27]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第二场 11.26
2020/11/30 DOTA
浅谈python中对于json写入txt文件的编码问题
2018/06/07 Python
Windows下python3.6.4安装教程
2018/07/31 Python
Python编写打字训练小程序
2019/09/26 Python
python输出pdf文档的实例
2020/02/13 Python
求职信模板怎么做
2014/01/26 职场文书
社区平安建设方案
2014/05/25 职场文书
天坛导游词
2015/02/02 职场文书
老公保证书怎么写
2015/02/26 职场文书
Java Socket实现Redis客户端的详细说明
2021/05/26 Redis
win10重装系统后上不了网怎么办 win10重装系统网络故障的解决办法
2022/07/23 数码科技
JavaScript实现简单的音乐播放器
2022/08/14 Javascript