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 相关文章推荐
JS解析XML的实现代码
Nov 12 Javascript
web页面数据展示新想法(json)
Jun 08 Javascript
Extjs4中Form的使用之本地hiddenfield
Nov 26 Javascript
深入理解javascript变量声明
Nov 20 Javascript
scrollWidth,clientWidth,offsetWidth的区别
Jan 13 Javascript
JavaScript对数组进行随机重排的方法
Jul 22 Javascript
BootStrap和jQuery相结合实现可编辑表格
Apr 21 Javascript
Vue组件中slot的用法
Jan 30 Javascript
JS中call和apply函数用法实例分析
Jun 20 Javascript
Vue-router 中hash模式和history模式的区别
Jul 24 Javascript
Layui给数据表格动态添加一行并跳转到添加行所在页的方法
Aug 20 Javascript
javascript闭包的使用之按钮切换功能
Aug 30 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
IIS php环境配置PHP5 MySQL5 ZendOptimizer phpmyadmin安装与配置
2008/11/18 PHP
WordPress中制作导航菜单的PHP核心方法讲解
2015/12/11 PHP
功能强大的PHP POST提交数据类
2016/07/15 PHP
Zend Framework入门教程之Zend_Db数据库操作详解
2016/12/08 PHP
PHP实现的mysql读写分离操作示例
2018/05/22 PHP
详解json在php中的应用
2018/09/30 PHP
javascript 建设银行登陆键盘
2008/06/10 Javascript
解决AJAX中跨域访问出现'没有权限'的错误
2008/08/20 Javascript
基于jQuery的仿flash的广告轮播
2010/11/05 Javascript
基于jQuery的history历史记录插件
2010/12/11 Javascript
jquery load事件(callback/data)使用方法及注意事项
2013/02/06 Javascript
jquery.validate.js插件使用经验记录
2014/07/02 Javascript
jQuery中map()方法用法实例
2015/01/06 Javascript
DOM基础教程之事件对象
2015/01/20 Javascript
Node.js编程中客户端Session的使用详解
2015/06/23 Javascript
每天一篇javascript学习小结(Function对象)
2015/11/16 Javascript
angular ng-repeat数组中的数组实例
2017/02/18 Javascript
$.browser.msie 为空或不是对象问题的多种解决方法
2017/03/19 Javascript
纯js实现的积木(div层)拖动功能示例
2017/07/19 Javascript
Angular动画实现的2种方式以及添加购物车动画实例代码
2018/08/09 Javascript
Bootstrap 模态框自定义点击和关闭事件详解
2018/08/10 Javascript
JS函数动态传递参数的方法分析【基于arguments对象】
2019/06/05 Javascript
基于JS实现快速读取TXT文件
2020/08/25 Javascript
使用vue编写h5公众号跳转小程序的实现代码
2020/11/27 Vue.js
[43:58]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第二局
2016/02/27 DOTA
浅谈Python浅拷贝、深拷贝及引用机制
2016/12/15 Python
使用python将mysql数据库的数据转换为json数据的方法
2019/07/01 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
关于Kotlin中SAM转换的那些事
2020/09/15 Python
多视角3D逼真HTML5水波动画
2016/03/03 HTML / CSS
基于HTML5 的人脸识别活体认证的实现方法
2016/06/22 HTML / CSS
萨克斯第五大道英国:Saks Fifth Avenue英国
2019/04/01 全球购物
物价局领导班子四风问题整改措施
2014/10/26 职场文书
迎新生欢迎词
2015/01/23 职场文书
2015小学毕业班工作总结
2015/07/21 职场文书
MySQL中存储时间的最佳实践指南
2021/07/01 MySQL