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 相关文章推荐
W3C Group的JavaScript1.8 新特性介绍
May 19 Javascript
多浏览器兼容的获取元素和鼠标的位置的js代码
Dec 15 Javascript
TextArea不支持maxlength的解决办法(jquery)
Sep 13 Javascript
js动态切换图片的方法
Jan 20 Javascript
js轮盘抽奖实例分析
Apr 17 Javascript
微信小程序 Audio API详解及实例代码
Sep 30 Javascript
webuploader模态框ueditor显示问题解决方法
Dec 27 Javascript
推荐三款不错的图片压缩上传插件(webuploader、localResizeIMG4、LUploader)
Apr 21 Javascript
JavaScript基于扩展String实现替换字符串中index处字符的方法
Jun 13 Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
Sep 13 Javascript
angular4+百分比进度显示插件用法示例
May 05 Javascript
es5 类与es6中class的区别小结
Nov 09 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的知识
2006/11/17 PHP
PHP 面向对象 PHP5 中的常量
2010/05/05 PHP
PHP实现获取客户端IP并获取IP信息
2015/03/17 PHP
php解析xml方法实例详解
2015/05/12 PHP
求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路
2015/09/20 PHP
joomla数据库操作示例代码
2016/01/06 PHP
Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
2016/11/10 PHP
Zend Framework入门教程之Zend_View组件用法示例
2016/12/09 PHP
php 调用百度sms来发送短信的实现示例
2018/11/02 PHP
Discuz! 6.1_jQuery兼容问题
2008/09/23 Javascript
js关于字符长度限制的问题示例探讨
2014/01/24 Javascript
js获取url中的参数且参数为中文时通过js解码
2014/03/19 Javascript
javascript实现3D切换焦点图
2015/10/16 Javascript
基于angular中的重要指令详解($eval,$parse和$compile)
2016/10/21 Javascript
Vue实现搜索 和新闻列表功能简单范例
2018/03/16 Javascript
使用Vue.js和Flask来构建一个单页的App的示例
2018/03/21 Javascript
JS的函数调用栈stack size的计算方法
2018/06/24 Javascript
微信小程序实现的动态设置导航栏标题功能示例
2019/01/31 Javascript
浅谈JavaScript中this的指向问题
2020/07/28 Javascript
[02:16]DOTA2英雄基础教程 干扰者
2014/01/15 DOTA
【Python】Python的urllib模块、urllib2模块批量进行网页下载文件
2016/11/19 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
使用Python写一个小游戏
2018/04/02 Python
Python Grid使用和布局详解
2018/06/30 Python
VSCode中autopep8无法运行问题解决方案(提示Error: Command failed,usage)
2021/03/02 Python
CSS3对背景图片的裁剪及尺寸和位置的设定方法
2016/03/07 HTML / CSS
html5 桌面提醒:Notifycations应用介绍
2012/11/27 HTML / CSS
JD Sports法国:英国篮球和运动时尚的领导者
2017/09/28 全球购物
澳大利亚音乐商店:Bava’s Music City
2019/05/05 全球购物
abstract class和interface有什么区别?
2012/01/03 面试题
TCP/IP中的TCP和IP分别承担什么责任
2012/04/21 面试题
小学生母亲节演讲稿
2014/05/07 职场文书
中班下学期个人工作总结
2015/02/12 职场文书
vue-cropper插件实现图片截取上传组件封装
2021/05/27 Vue.js
教你使用Python获取QQ音乐某个歌手的歌单
2022/04/03 Python
JavaScript实现一键复制内容剪贴板
2022/07/23 Javascript