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 ...
随机推荐
- SQL Server性能优化(1)使用SET函数
在一切开始之前,先看下微软的建议:在系统的整体性能优化里面, TSQL优化优先级并不是最高的. 本文包括四部分: SET STATISTICS TIME ON SET STATISTICS IO SE ...
- Django:快速搭建简单的Blog
一,创建项目 1, 为blog创建名为mysite的工程项目: django-admin.py startproject mysite 2, 项目结构如下: mysite ├── manage.py ...
- css3动画实例
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- foj 2044 1 M possible 二进制压缩
题目链接: http://acm.fzu.edu.cn/problem.php?pid=2044 题意: 给出 一大堆数,找出2个出现次数模3 为1 的两个数字 题解: 把一个数分为几位拆开统计 ...
- 引擎设计跟踪(九.14.2a) 导出插件问题修复和 Tangent Space 裂缝修复
由于工作很忙, 近半年的业余时间没空搞了, 不过工作马上忙完了, 趁十一有时间修了一些小问题. 这次更新跟骨骼动画无关, 修复了一个之前的, 关于tangent space裂缝的问题: 引擎设计跟踪( ...
- js生成唯一值的函数
利用了js的闭包性质 var uniqueNumber = (( function(){ var value = 0; return function(){ return ++value; }; }) ...
- Ubuntu下开启ssh服务
网上有很多介绍在Ubuntu下开启SSH服务的文章,但大多数介绍的方法测试后都不太理想,均不能实现远程登录到Ubuntu上,最后分析原因是都没有真正开启ssh-server服务.最终成功的方法如下: ...
- 直面Javascript面试题算法思路
一.字符串遍历类 1.获取符合条件的字符 思路:一般使用正则表达式会比遍历字符串简单.a=str.match(reg),a即为所得. 例子:a.判断字符串是否是这样组成的,第一个必须是字母,后面可以是 ...
- 由浅入深了解Thrift之结果封装
一.thrift返回结果封装 Thrift文件添加版本号,方便对thrift的版本进行控制 服务与返回的数据类型分开定义 在项目中使用Thrift提供RPC服务时,很多情况下我们都会将返回的结果进行封 ...
- uva 10817
Problem D: Headmaster's Headache Time limit: 2 seconds The headmaster of Spring Field School is cons ...