dojo 十一 jsonp
官方教程:Getting Jiggy with JSONP
Dojo对Ajax实现的框架XHR的功能很强大,但 XHR 框架的函数有一问题就是不能跨域访问,浏览器不允许 XHR
对象访问其他域的站点。
此时我们就要用到JSONP技术。
什么是JSONP?
JSONP(JSON with
Padding)是一种实现脚本动态加载的技术。JSON 表示返回的 Javascript 其实就是一 JSON 对象,这是使用 JSONP 这种方式的前提条件。
Padding 表示在 JSON
对象前要附加上一些东西。
JSONP技术的原理
我们知道在<script>标签里src属性是可以指向本域或其他域的文件,只要这些文件最后返回的是
javascript 。返回的 javascript 会立即在浏览器中执行,执行结果存储在本地浏览器。script
标签不仅可以静态添加到页面中,也可以被动态插入到页面中,而且通过 DOM 操作方式动态插入的 script 标签具有与静态 script 标签一样的效果,动态
script 标签引用的 javascript
文件也会被执行。
这里又出现一个问题,如何判断动态加载的脚本执行完毕?有了JSONP就不必担心这个问题。JSONP会在脚本执行完后自动调用我们想要执行的回调函数。
require([
"dojo/io/script"
,
"dojo/domConstruct"
,
"dojo/domReady!"
],
function
(ioScript, domConstruct){
//make the request just as before
ioScript.get({
callbackParamName:
"callback"
,
content: {q:
"#dojo"
}
}).then(
function
(data){
//we're only interested in data.results, so
strip it off and return it
return
data.results;
}).then(
function
(results){
//create an interval timer that will remove the
first item in
//the array and render it. Stop the loop when
the results have been
//exhausted.
var
handle =
setInterval(
function
(){
domConstruct.create(
"li"
,
{innerHTML:
results.shift().text},
"tweets"
);
if
(results.length <
1){
clearInterval(handle);
}
}, 200);
});
});
首先要引入包dojo/io/script
然后调用script.get方法。方法中的参数同xhr.get方法一样,除了callbackParamName这个参数。
callbackParamName:指定回调方法名
称,即动态脚本加载并执行完后调用的那个本地的方法。指定了这个参数,dojo会按JSONP的方式来处理。但并不一定要指向一个已经定义好的方法,如上例中的callback,本地并没有实现这个方法,dojo会自动创建一个回调函数并执行,但什么也不做。then方法会在get中指定的回调函数执行完后再执行。其中参数data即为跨域请求后返回的数据,它是一个JSON对象。
需要注意的时,JSONP不能像XHR一样对失败的请求进行处理,但我们可以通过设置timeout属性,对超时的情况进行处理。
dojo 十一 jsonp的更多相关文章
- JS框架设计之模块加载系统
任何语言一到大规模应用阶段,必然要拆封模块,有利于维护和团队协作,与Java走得最近的dojo率先引进了加载器,使用document.write与同步Ajax请求实现,后台dojo以JSONP的方法来 ...
- 循序渐进Python3(十一) --6-- Ajax 实现跨域请求 jsonp 和 cors
Ajax操作如何实现跨域请求? Ajax (XMLHttpRequest)请求受到同源策略的限制. Ajax通过XMLHttpRequest能够与远程的服务器进行信息交互,另外 ...
- Dojo前端开发框架与jQuery前端开发框架,对比分析总结
最近Dojo和jQuery双双发布了最新的1.8版本,有着相同版本号的两个Javascript库也有许多核心的相同之处:相同的资源加载机制AMD.相同的选择器 引擎Sizzle等.作为业界知名的Jav ...
- jQuery源码分析系列(35) : Ajax - jsonp的实现与原理
ajax的核心是通过XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加<script>标签来调用服务器提供的js脚本 json核心就是:允许用户传递一个callba ...
- AngularJS中的JSONP实践
欢迎大家指导与讨论: ) 概念 首先呢,Json和JSONP是不一样的哦.Json呢,是众多数据存储的其中一种格式,是数据书写方式的其中一种.好比是大中华众多诗体的一种(比如说是七言诗吧).这种诗体规 ...
- dojo Provider(script、xhr、iframe)源码解析
总体结构 dojo/request/script.dojo/request/xhr.dojo/request/iframe这三者是dojo提供的provider.dojo将内部的所有provider构 ...
- dojo/request模块整体架构解析
总体说明 做前端当然少不了ajax的使用,使用dojo的童鞋都知道dojo是基于模块化管理的前端框架,其中对ajax的处理位于dojo/request模块.一般情况下我们使用ajax请求只需要引入do ...
- dojo(四):ajax请求
储备知识 1.在介绍新版本的ajax请求之前,需要先了解一些dojo/Deferreds. 初次听到“Deferred”这个概念,可能会觉得这是一个神秘的东西.实际上它在执行异步操作的时候非常强大,例 ...
- dojo.io.script
dojo.io.script 定义: 跨域访问数据,可以动态的将script标签插入到网页当中. 局限: 1.只支持get方式访问: 2.只支持异步调用. 使用: 1.dojo.io.script.g ...
随机推荐
- IntelliJ IDEA 15激活
1.按正常的安装方法安装好IDEA : 2.使用iteblog提供的License server(服务器地址为http://www.iteblog.com/idea/key.php)进行注册 ---- ...
- 通过Log4j的DEBUG级别来显示mybatis的sql语句
为了更加方便调试sql语句,需要显示mybatis的sql语句. 网络上的一般方式都是通过log4j来实现,但是很多都有问题. 经过实验,以下代码能够保持正常:(只显示myb ...
- frequentism-and-bayesianism-chs-ii
frequentism-and-bayesianism-chs-ii 频率主义 vs 贝叶斯主义 II:当结果不同时 这个notebook出自Pythonic Perambulations的博文 ...
- 如何使用CSL(翻译总结自TI官方文档)
为了使用CSL来进行编译和连接,必须先配置CCS开发环境. 1.指定目标设备 Project/options/complier/preprocessor,在define symbols中输入设备支持符 ...
- PowerDesigner(六)-物理数据模型(PDM逆向工程)(转)
物理数据模型PDM 物理数据模型(Physical Data Model,PDM):在数据库的逻辑结构设计好之后,就需要完成其物理设计,PDM就是为实现这一目的而设计的. 物理数据模型是以常用的DBM ...
- set gameobject Icons by Script
有很多时候我们需要在编辑器查看一个Gameobject的移动,有些人采用Gizoms类,可是如果不想用,可以使用U3D内置的Icon类. 但是如果想在脚本中设置而不是通过手动选择呢? Google之, ...
- Sqli-labs less 55
Less-55 本关的sql语句为: $sql="SELECT * FROM security.users WHERE id=($id) LIMIT 0,1"; 其余和less54 ...
- 高质量图形库:pixellib
点这里 pixellib 是高质量 2D 图形库: 高质量抗锯齿,矢量图形绘制 多种图像格式: RGB, BGR, ARGB, ABGR, RGBA, BGRA 8 / 15 / 16 / 24 / ...
- HDU 1788 Chinese remainder theorem again
题目链接 题意 : 中文题不详述. 思路 : 由N%Mi=(Mi-a)可得(N+a)%Mi=0;要取最小的N即找Mi的最小公倍数即可. #include <cstdio> #include ...
- hdu 3118(二进制枚举)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3118 思路:题目要求是去掉最少的边使得图中不存在路径长度为奇数的环,这个问题等价于在图中去掉若干条边, ...