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 相关文章推荐
轻量级javascript 框架Backbone使用指南
Jul 24 Javascript
js+css实现有立体感的按钮式文字竖排菜单效果
Sep 01 Javascript
javascript简单判断输入内容是否合法的方法
May 11 Javascript
JS实现将数字金额转换为大写人民币汉字的方法
Aug 02 Javascript
jQuery使用正则表达式替换dom元素标签用法示例
Jan 16 Javascript
JS实现PC手机端和嵌入式滑动拼图验证码三种效果
Feb 15 Javascript
seajs中最常用的7个功能、配置示例
Oct 10 Javascript
在vue中,v-for的索引index在html中的使用方法
Mar 06 Javascript
vue弹窗插件实战代码
Sep 08 Javascript
Vue项目从webpack3.x升级webpack4不完全指南
Apr 28 Javascript
微信小程序自定义底部弹出框动画
Nov 18 Javascript
ElementUI实现el-form表单重置功能按钮
Jul 21 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
用cookies来跟踪识别用户
2006/10/09 PHP
php 处理上百万条的数据库如何提高处理查询速度
2010/02/08 PHP
PHP通过内置函数memory_get_usage()获取内存使用情况
2014/11/20 PHP
thinkphp3.x中display方法及show方法的用法实例
2016/05/19 PHP
php获取服务器操作系统相关信息的方法
2016/10/08 PHP
PHP判断数组是否为空的常用方法(五种方法)
2017/02/08 PHP
用cookies实现的可记忆的样式切换效果代码下载
2007/12/24 Javascript
jsTree树控件(基于jQuery, 超强悍)[推荐]
2009/09/01 Javascript
防止动态加载JavaScript引起的内存泄漏问题
2009/10/08 Javascript
Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
2010/06/11 Javascript
js中iframe调用父页面的方法
2014/10/30 Javascript
js带缩略图的图片轮播效果代码分享
2015/09/14 Javascript
jQuery插件Easyui设置datagrid的pageNumber导致两次请求问题的解决方法
2016/08/06 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
2017/01/19 Javascript
浅谈JavaScript正则表达式-非捕获性分组
2017/03/08 Javascript
React-Native做一个文本输入框组件的实现代码
2017/08/10 Javascript
用Vue.js方法创建模板并使用多个模板合成
2019/06/28 Javascript
Vue.js递归组件实现组织架构树和选人功能案例分析
2019/07/03 Javascript
vue弹出框组件封装实例代码
2019/10/31 Javascript
python中lambda函数 list comprehension 和 zip函数使用指南
2014/09/28 Python
Java中重定向输出流实现用文件记录程序日志
2015/06/12 Python
Django权限机制实现代码详解
2018/02/05 Python
Python3基于sax解析xml操作示例
2018/05/22 Python
python将.ppm格式图片转换成.jpg格式文件的方法
2018/10/27 Python
python爬虫神器Pyppeteer入门及使用
2019/07/13 Python
Django单元测试工具test client使用详解
2019/08/02 Python
Django1.11配合uni-app发起微信支付的实现
2019/10/12 Python
python模拟实现斗地主发牌
2020/01/07 Python
Python安装Bs4的多种方法
2020/11/28 Python
大学生个人求职信范文
2013/09/21 职场文书
美德好少年事迹材料
2014/01/19 职场文书
《翻越远方的大山》教学反思
2014/04/13 职场文书
html5移动端禁止长按图片保存的实现
2021/04/20 HTML / CSS
nginx配置限速限流基于内置模块
2022/05/02 Servers
Java Spring Boot请求方式与请求映射过程分析
2022/06/25 Java/Android
win10电脑右下角输入法图标不见了?Win10右下角不显示输入法的解决方法
2022/07/23 数码科技