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使用办法
Apr 01 Javascript
面向对象Javascript核心支持代码分享
May 23 Javascript
JQuery 图片滚动轮播示例代码
Mar 24 Javascript
js实现鼠标点击左上角滑动菜单效果代码
Sep 06 Javascript
IOS中safari下的select下拉菜单文字过长不换行的解决方法
Sep 26 Javascript
JS检测是否可以访问公网服务器功能代码
Jun 19 Javascript
Vue 组件封装 并使用 NPM 发布的教程
Sep 30 Javascript
详解Vue+ElementUI从零开始搭建自己的网站(一、环境搭建)
Apr 30 Javascript
使用vue-router切换页面时,获取上一页url以及当前页面url的方法
May 06 Javascript
微信小程序实现的picker多级联动功能示例
May 23 Javascript
layer关闭弹出窗口触发表单提交问题的处理方法
Sep 25 Javascript
js实现九宫格布局效果
May 28 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
解析php file_exists无效的解决办法
2013/06/26 PHP
PHP中Notice错误常见解决方法
2017/04/28 PHP
PHP xpath()函数讲解
2019/02/11 PHP
php设计模式之适配器模式原理、用法及注意事项详解
2019/09/24 PHP
php面向对象重点知识分享
2019/09/27 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
2020/05/26 PHP
javascript一些不错的函数脚本代码
2008/09/10 Javascript
JavaScript定义类和对象的方法
2014/11/26 Javascript
AngularJS的内置过滤器详解
2015/05/14 Javascript
理解Javascript的动态语言特性
2015/06/17 Javascript
在for循环中length值是否需要缓存
2015/07/27 Javascript
JavaScript实现将文本框的值插入指定位置的方法
2015/08/13 Javascript
基于JS实现checkbox全选功能实例代码
2016/10/31 Javascript
基于Node.js + WebSocket打造即时聊天程序嗨聊
2016/11/29 Javascript
Vue基于NUXT的SSR详解
2017/10/24 Javascript
基于Electron实现桌面应用开发代码实例
2020/07/07 Javascript
[58:00]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第二场 2月7日
2021/03/11 DOTA
Python使用Srapy框架爬虫模拟登陆并抓取知乎内容
2016/07/02 Python
Python使用正则表达式抓取网页图片的方法示例
2017/04/21 Python
python爬取网页转换为PDF文件
2018/06/07 Python
pycharm重命名文件的方法步骤
2019/07/29 Python
python文字和unicode/ascll相互转换函数及简单加密解密实现代码
2019/08/12 Python
Python监控服务器实用工具psutil使用解析
2019/12/19 Python
Python经典五人分鱼实例讲解
2021/01/04 Python
python 批量将中文名转换为拼音
2021/02/07 Python
美国办公用品购物网站:Quill.com
2016/09/01 全球购物
Roxy俄罗斯官方网站:冲浪和滑雪板的一切
2020/06/20 全球购物
linux比较文件内容的命令是什么
2013/03/04 面试题
仓库管理专业个人的自我评价
2013/12/30 职场文书
汽车维修专业个人求职信范文
2014/01/01 职场文书
幼师求职信
2014/06/23 职场文书
群众路线四风自我剖析材料
2014/10/08 职场文书
导游词之南京莫愁湖公园
2019/11/13 职场文书
两行代码解决Jupyter Notebook中文不能显示的问题
2021/04/24 Python
使用canvas仿Echarts实现金字塔图的实例代码
2021/11/11 HTML / CSS
Win11 Build 21996.1 Dev版怎么样? win11系统截图欣赏
2021/11/21 数码科技