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 ...
随机推荐
- transitionend 事件的兼容
google :webkitTransitionEnd firefox :transitionend ie : MSTransitionEnd
- 设计模式之工厂模式(Factory)
设计模式的工厂模式一共有三种:简单工厂模式,工厂模式,抽象工厂模式 简单工厂模式原理:只有一个工厂类,通过传参的形式确定所创建的产品对象种类 代码如下: #include <stdio.h> ...
- D3D11 Debug Layer的bug
在开发D3D应用程序时,我们会使用Debug Layer来调试应用程序,以确保我们的程序在最终发布时没有warnings和errors.不过最近在开发应用程序时遇到了这样的问题,就是我把多个网格模型的 ...
- leetcode majority number
给定一组数,有一个数在这组数里的出现次数超过n/2次. 求出这是哪个数 https://leetcode.com/problems/majority-element/ 一开始考虑的方是将所有数转化为二 ...
- 【三】php之梗
1.php没有顶级作用域,所以你没办法在函数内部使用变量(参数传递除外,而且常量是可以的哟),所以你的变量即使是static的也不能在函数外声明函数里用.除非借助global关键字修饰变量才可以.但是 ...
- Jmeter测试Mysql
一.在测试计划下,找到Add directory or jar to classpath下填入jdbc驱动路径. 二.新建线程组. 三.在线程组下,添加配置元件—JDBC Connection Con ...
- POJ 3978 Primes(素数筛选法)
题目 简单的计算A,B之间有多少个素数 只是测试数据有是负的 //AC //A和B之间有多少个素数 //数据可能有负的!!! #include<string.h> #include< ...
- laravel笔记
向视图中传递变量 使用with()方法 return view('articles.lists')->with('title',$title); 直接给view()传参数 return view ...
- Twitter注册
Twitter注册 - (一般分享不了是回调地址不对) 1.打开twitter的官网https://dev.twitter.com,如果还没有注册账号的,需要注册账号,已经注册账号的,请先登录: 2. ...
- com组件的注册
错误: 检索 COM 类工厂中 CLSID 为 {79AD7B73-C515-40B4-8B02-CB0F5FA5A1A8} 的组件失败,原因是出现以下错误: 80040154 没有注册类 (异常来自 ...