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获取IFRAME当前的URL的方法
Nov 13 Javascript
js arguments,jcallee caller用法总结
Nov 30 Javascript
Javascript 实现简单计算器实例代码
Oct 23 Javascript
微信小程序 wx:key详细介绍
Oct 28 Javascript
详解jQuery选择器
Dec 21 Javascript
详解Vue2中组件间通信的解决全方案
Jul 28 Javascript
React Native使用Modal自定义分享界面的示例代码
Oct 31 Javascript
webpack多入口多出口的实现方法
Aug 17 Javascript
利用vue.js把静态json绑定bootstrap的table方法
Aug 28 Javascript
vue router 源码概览案例分析
Oct 09 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
Nov 20 Javascript
vue elementUI批量上传文件
Apr 26 Vue.js
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中替换字符串函数strtr()和str_repalce()的用法与区别
2016/11/25 PHP
php图像处理函数imagecopyresampled用法详解
2016/12/02 PHP
关于IFRAME 自适应高度的研究
2006/07/20 Javascript
javascript 模式设计之工厂模式详细说明
2010/05/10 Javascript
jquery获得下拉框值的代码
2011/08/13 Javascript
Json字符串转换为JS对象的高效方法实例
2013/05/01 Javascript
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
2013/05/24 Javascript
IE6 hack for js 集锦
2014/09/23 Javascript
8个超实用的jQuery功能代码分享
2015/01/08 Javascript
ajax与json 获取数据并在前台使用简单实例
2017/01/19 Javascript
Angular中ng-bind和ng-model的区别实例详解
2017/04/10 Javascript
JavaScript实现树的遍历算法示例【广度优先与深度优先】
2017/10/26 Javascript
Vue DevTools调试工具的使用
2017/12/05 Javascript
新版vue-cli模板下本地开发环境使用node服务器跨域的方法
2018/04/03 Javascript
Vue配合iView实现省市二级联动的示例代码
2018/07/27 Javascript
9102了,你还不会移动端真机调试吗
2019/03/25 Javascript
JavaScript实现横版菜单栏
2020/03/17 Javascript
详解实现vue的数据响应式原理
2021/01/20 Vue.js
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
Python中集合的内建函数和内建方法学习教程
2015/08/19 Python
Python实现HTTP协议下的文件下载方法总结
2016/04/20 Python
python复制文件到指定目录的实例
2018/04/27 Python
使用python生成杨辉三角形的示例代码
2018/08/29 Python
pandas pivot_table() 按日期分多列数据的方法
2018/11/16 Python
python错误调试及单元文档测试过程解析
2019/12/19 Python
在Django中预防CSRF攻击的操作
2020/03/13 Python
html5是什么_动力节点Java学院整理
2017/07/07 HTML / CSS
美体小铺法国官方网站:The Body Shop法国
2020/06/04 全球购物
网游商务专员求职信
2013/10/15 职场文书
写给妈妈的道歉信
2014/01/11 职场文书
庆元旦广播稿
2014/02/10 职场文书
党风廉政建设责任书
2014/04/14 职场文书
先进事迹材料怎么写
2014/12/30 职场文书
2015年领导班子工作总结
2015/05/23 职场文书
背起爸爸上学观后感
2015/06/08 职场文书
导游词之江苏溱潼古镇
2019/11/27 职场文书