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选择器的工作原理和优化分析
Jul 25 Javascript
javascript 事件处理、鼠标拖动效果实现方法详解
May 11 Javascript
js网页中的(运行代码)功能实现思路
Feb 04 Javascript
让元素在网页中可拖动示例代码
Aug 13 Javascript
jQuery焦点图切换特效插件封装实例
Aug 18 Javascript
两种方法基于jQuery实现IE浏览器兼容placeholder效果
Oct 14 Javascript
javascript实现多栏闭合展开式广告位菜单效果实例
Aug 05 Javascript
JavaScript中数组的合并以及排序实现示例
Oct 24 Javascript
JS弹出对话框实现方法(三种方式)
Dec 18 Javascript
JS使用插件cryptojs进行加密解密数据实例
May 11 Javascript
教你如何编写Vue.js的单元测试的方法
Oct 17 Javascript
深入解析ES6中的promise
Nov 08 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
使用bcompiler对PHP文件进行加密的代码
2010/08/29 PHP
PHP 基于文件头的文件类型验证类函数
2012/05/01 PHP
php获取汉字拼音首字母的方法
2015/10/21 PHP
PHP实现的构造sql语句类实例
2016/02/03 PHP
详解PHP数据压缩、加解密(pack, unpack)
2016/12/17 PHP
PHP自定义序列化接口Serializable用法分析
2017/12/29 PHP
[转]JS宝典学习笔记
2007/02/07 Javascript
jquery多浏览器捕捉回车事件代码
2010/06/22 Javascript
JS面向对象编程之对象使用分析
2010/08/19 Javascript
Javascript变量作用域详解
2013/12/06 Javascript
javascript中类的定义方式详解(四种方式)
2015/12/22 Javascript
详解微信小程序获取当前时间及日期的方法
2019/04/28 Javascript
js中比较两个对象是否相同的方法示例
2019/09/02 Javascript
JS如何操作DOM基于表格动态展示数据
2020/10/15 Javascript
使用Vant完成DatetimePicker 日期的选择器操作
2020/11/12 Javascript
[18:20]DOTA2 HEROS教学视频教你分分钟做大人-昆卡
2014/06/11 DOTA
Python实现一个简单的MySQL类
2015/01/07 Python
python字符串对其居中显示的方法
2015/07/11 Python
实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
2016/01/20 Python
如何用itertools解决无序排列组合的问题
2017/05/18 Python
深入理解Python分布式爬虫原理
2017/11/23 Python
解决python 输出是省略号的问题
2018/04/19 Python
一些Centos Python 生产环境的部署命令(推荐)
2018/05/07 Python
Django框架 querySet功能解析
2019/09/04 Python
Python3 使用selenium插件爬取苏宁商家联系电话
2019/12/23 Python
python类共享变量操作
2020/09/03 Python
使用python-cv2实现视频的分解与合成的示例代码
2020/10/26 Python
CSS3颜色值RGBA与渐变色使用介绍
2020/03/06 HTML / CSS
html5音频_动力节点Java学院整理
2018/08/22 HTML / CSS
利用HTML5实现使用按钮控制背景音乐开关
2015/09/21 HTML / CSS
Hunter Boots美国官方网站:赫特威灵顿雨靴
2018/06/16 全球购物
英国复古服装购物网站:Collectif
2019/10/30 全球购物
优秀体育委员自荐书
2014/01/31 职场文书
人事部岗位职责范本
2014/03/05 职场文书
工地标语大全
2014/06/18 职场文书
金陵十三钗观后感
2015/06/04 职场文书