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中的有名函数和无名函数
Oct 17 Javascript
修改file按钮的默认样式实现代码
Apr 23 Javascript
jquery全选checkBox功能实现代码(取消全选功能)
Dec 10 Javascript
eclipse导入jquery包后报错的解决方法
Feb 17 Javascript
js清空form表单中的内容示例
May 20 Javascript
javascript设计模式之解释器模式详解
Jun 05 Javascript
Seajs 简易文档 提供简单、极致的模块化开发体验
Apr 13 Javascript
Bootstrap按钮组件详解
Apr 26 Javascript
json实现添加、遍历与删除属性的方法
Jun 17 Javascript
input框中自动展示当前日期yyyy/mm/dd的实现方法
Jul 06 Javascript
Vue监听一个数组id是否与另一个数组id相同的方法
Sep 26 Javascript
jquery+php后台实现省市区联动功能示例
May 23 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
解析thinkphp中的M()与D()方法的区别
2013/06/22 PHP
php一些错误处理的方法与技巧总结
2013/08/10 PHP
PHP把数字转成人民币大写的函数分享
2014/06/30 PHP
php合并数组并保留键值的实现方法
2018/03/12 PHP
javascript事件模型代码
2007/07/01 Javascript
js优化针对IE6.0起作用(详细整理)
2012/12/25 Javascript
jquery使用jxl插件导出excel示例
2014/04/14 Javascript
详解JavaScript的Polymer框架中的通知交互
2015/07/29 Javascript
老生常谈combobox和combotree模糊查询
2017/04/17 Javascript
JS实现给json数组动态赋值的方法示例
2020/03/19 Javascript
BootStrap 页签切换失效的解决方法
2017/08/17 Javascript
浅谈基于Vue.js的移动组件库cube-ui
2017/12/20 Javascript
element-ui表格列金额显示两位小数的方法
2018/08/24 Javascript
vue2.0 如何在hash模式下实现微信分享
2019/01/22 Javascript
详解 微信小程序开发框架(MINA)
2019/05/17 Javascript
JS中超越现实的匿名函数用法实例分析
2019/06/21 Javascript
javascript实现前端input密码输入强度验证
2020/06/24 Javascript
[01:00]DOTA2 store: Collection of Artisan's Wonders
2015/08/12 DOTA
python3.5仿微软计算器程序
2020/03/30 Python
Python实现字符串格式化输出的方法详解
2017/09/20 Python
python使用selenium实现批量文件下载
2019/03/11 Python
10个Python面试常问的问题(小结)
2019/11/20 Python
pycharm激活码有效到2020年11月底
2020/09/18 Python
Python求平面内点到直线距离的实现
2020/01/19 Python
html5中监听canvas内部元素点击事件的三种方法
2019/04/28 HTML / CSS
婚前财产公证书
2014/04/10 职场文书
文明礼貌演讲稿
2014/05/12 职场文书
心理学专业求职信
2014/06/16 职场文书
乡镇爱国卫生月活动总结
2014/06/25 职场文书
党员教师批评与自我批评发言稿
2014/10/15 职场文书
2014年建筑工作总结
2014/11/26 职场文书
个人年底工作总结
2015/03/10 职场文书
python图片灰度化处理的几种方法
2021/06/23 Python
浅谈哪个Python库才最适合做数据可视化
2021/06/28 Python
GTX1650super好不好 gtx1650super显卡属于什么级别
2022/04/08 数码科技
什么是clearfix (一文搞清楚css清除浮动clearfix)
2023/05/21 HTML / CSS