JSON with Padding (JSONP)现在已经成为浏览器端跨域访问资源的常用解决方法。在本教程中,将会介绍JSONP是什么,并告诉你如何使用它来跨域获取数据。
难度:初学者
Dojo版本:1.6
作者:Dustin Machi
原文:Getting Jiggy with JSONP
开始上手
Dojo内置的Ajax模块提供了一套简单而强大的接口来动态获取资源。然而,浏览器的跨域安全策略会限制你使用XHR请求另一个域下的资源。这该怎么办呢?越来越多的现代浏览器开始遵循W3C的Cross-Origin Resource Sharing 规约来提供跨域请求的能力,但是,并不是所有浏览器都这么做了,并且大量已有的服务还没有从该规约中受益。
解决跨域交互的方法之一就是使用JSONP(JSON with Padding)。 Bob Inppolito 早在2005年便提出了JSONP技术,如今,Google,Twitter,Facebook等公司都提供JSONP API来访问其服务。Dojo的dojo.io.script模块提供了一套无缝的接口来访问JSONP资源,让你免去繁复的JSONP使用细节。
那到底什么是JSONP技术呢?和XHR不同的是,浏览器不会阻止从别的域加载脚本。使用JSONP会先动态地向叶面注入一个<script>标签元素,然后执行插入的脚本。其中的技巧在于在url中提供查询参数,并将其返回的JSON结果包裹在一个回调函数中。例如:一个请求发送到endpoint?q=dojo&callback=callme,其返回值为:
之后浏览器将会解释执行这段代码,也就是说它会调用一个名为callme的函数,并将返回的数据传给这个函数作为参数。本地的应用程序需要具体实现callme方法来接受传入的数据。需要注意的是,使用JSONP本质是在执行一段来自第三方的脚本,这也意味着你应该确保你的应用程序使用的的第三方服务是安全的。但这并不是说JSONP不好或是应该被避免使用,仅仅它应该被用在与可信任的第三方服务的交互上。
!使用JSONP来访问跨域资源还会减少你的应用程序Web服务器的连接竞争。浏览器会限制同一时刻连接到某一个服务器的请求数。最坏的情况是IE6,它限制同一时刻只能有2个连接。而在其它新一点的浏览器中,这个限制是6-8个连接。在跨域访问一个资源时,它不会被算在访问你的服务器的总连接数中。
dojo.io.script将创建script元素和回调函数的过程进行了自动化,并提供了Dojo中你所熟悉的Deferred接口。使用这一切只需加载dojo.io.script模块:
dojo.require("dojo.io.script")
上述代码和你通常看到的dojo.xhr的使用方法非常相似。其中比较特别的可能就是callbackParamName;这个属性告诉Dojo哪一个参数会被用来指定回调函数名(它并不是回调函数名本身)。这个参数对于不同服务也有所不同。
之后,你就可以像处理其他方式返回的内容一样来处理返回结果。
上面的代码会获取最新的关于dojo的tweet,现在我们来添加一些代码将获取的内容显示出来。
这样就差不多了,为了让它更酷一点,我们让程序一次一条地逐个添加tweet:
查看示例
!JSONP的机制(动态插入<script>标签)使得它无法像标准Ajax请求一样处理异常。浏览器不会在脚本加载失败(404, 500等异常)时告知应用程序,所以dojo.io.script回调函数也不会在这种情况下捕捉到任何信号。因此为了让你的应用程序可以继续运行下去而不是出错了还在那里傻等,你可以为dojo.io.script请求设置一个timeout属性。如果回调函数在时间到之前还没有被处理,Deferred对象会被关闭,从而使得你的应用程序继续运行下去。
结论
JSONP使得我们可以访问许多丰富的资源来结合你自己的应用程序创造出有趣、新奇的东西。大多数主流Web应用都提供了访问他们服务的JSONP接口。通过JSONP来访问子域名下的资源也可以为有连接数限制的浏览器减少压力。与dojo.xhr类似的API将使你能很快上手使用dojo.io.script来访问异步资源。
如果你想要一些练习,你可以尝试使用Flickr JSON API并将返回的图片结果显示出来。为了帮助你开始熟悉,这里是一个返回Dojo Toolkit相关图片的Flickr url:
http://api.flickr.com/services/feeds/photos_public.gne?tags=dojotoolkit&lang=en-us&format=json
分享到:
相关推荐
《dojo权威入门教程》是一本专注于JavaScript库Dojo Toolkit的学习指南,主要面向Java开发者或对Web前端技术感兴趣的人员。Dojo Toolkit是一个强大的JavaScript框架,它提供了丰富的组件、工具和API,帮助开发者高效...
### Dojo 快速入门知识点详解 #### 一、Dojo 概览 Dojo 是一个功能强大且灵活的开源 JavaScript 库,主要用于构建高性能的富客户端 Web 应用程序。Dojo 提供了一系列工具和组件,使得开发者能够轻松创建交互式 Web...
《dojo快速入门(中文版)》 dojo Toolkit是一个开源的JavaScript工具包,旨在简化Web应用的构建过程,提供高效且设计精良的API。它的轻量级特性(约26kb)和强大的功能集使得dojo在各种项目中都能灵活运用。核心功能...
在入门Dojo时,首先需要了解如何安装和引入Dojo到项目中。这通常涉及到在HTML文件中添加Dojo的CDN链接或者下载Dojo库并本地引用。同时,设置Dojo的配置选项,如dojoConfig,用于定义模块加载的路径、调试模式等。 ...
《Dojo入门》这本书主要介绍了Dojo JavaScript库的使用,帮助初学者快速掌握这个强大的前端开发工具。Dojo是一个开源的JavaScript框架,旨在提供一站式的解决方案,包括UI组件、数据管理、动画效果、Ajax交互等功能...
### Dojo Toolkit:快速入门与理解 #### 一、引言 Dojo Toolkit是一个功能强大且灵活的开源JavaScript框架,专为构建现代化Web应用程序而设计。它的目标是简化Web开发,提供一系列工具来加速和优化Web应用的创建...
Dojo 是一个强大的JavaScript工具库,它为Web开发提供了丰富的功能和组件,包括DOM操作、事件处理、动画效果、模块管理以及数据存储等。本文将通过一系列实例,帮助初学者快速掌握Dojo的核心概念和使用方法。 首先...
### Dojo技术入门知识点概述 #### 一、Dojo简介 Dojo是一个开源的JavaScript工具包,主要用于构建富互联网应用(Rich Internet Applications, RIA)。它具有轻量级且易于安装的特点,在Web 2.0时代,随着Ajax技术...
### Dojo 快速入门详解 #### 一、Dojo Toolkit 概览 Dojo Toolkit 是一款开源的 JavaScript 工具包,专为构建现代化 Web 应用而设计。其核心价值在于通过提供一系列高质量的 API 和工具集,极大地简化了 Web 开发...
### Dojo快速入门教程 Dojo 是一个功能强大的面向对象 JavaScript 框架,它能够帮助开发者构建高性能、跨平台的 Web 应用程序。本教程将详细介绍 Dojo 的核心概念、基本用法以及如何利用 Dojo 开发 Web 应用。 ###...
而"dojo1.11中文入门手册pdf"则是针对Dojo 1.11版本的中文学习资料,对于初学者来说是一份很好的学习资源。 Dojo 1.8是Dojo Toolkit的一个重要版本,它引入了许多新特性,例如模块化系统AMD(Asynchronous Module ...
dojo入门系列教程,包含入门简介,在javascript基础上介绍dojo的语法特色,ajax的dojo包装---xhr框架的编程要点, Dojo 事件机制.以及对dojo最具特色的web UI设计的全面介绍.
内容很丰富,给有需要的人,壮大dojo社区
在《Dojo入门指南-中文版》中,读者将深入理解Dojo的核心概念,学习如何有效地使用这个框架来提升Web应用的性能和可维护性。 首先,Dojo的模块化系统是其独特之处,它基于AMD(Asynchronous Module Definition)...
ArcGIS for JS离线部署及Dojo框架入门 ArcGIS for JS是一个功能强大且流行的WebGIS开发框架,能够帮助开发者快速构建交互式的WebGIS应用程序。在这里,我们将讨论如何对ArcGIS for JS API进行离线部署,并介绍Dojo...
Dojo 是一个强大的JavaScript工具库,它为Web开发提供了丰富的功能和组件,涵盖了从DOM操作、事件处理到AJAX通信等多个方面。Dojo的核心在于它的模块化系统,这使得开发者可以按需加载代码,提高应用的性能和可维护...
### Dojo控件的使用和入门心得 #### Dojo简介及其优势 Dojo是一个功能强大的JavaScript框架,专门设计用于简化富互联网应用(RIA)的开发。作为一种DHTML Toolkit,Dojo封装了大量的常用功能,旨在提高前端开发...
5. `dojo.string.encodeAscii`、`dojo.string.escapeXml`、`dojo.string.escapeSql`、`dojo.string.escapeRegExp`、`dojo.string.escapeJavascript`和`dojo.string.escapeString`都是`dojo.string.escape`的特例化...
此外,`dojo/jsonp` 模块则用于 JSONP 跨域请求,适用于那些不支持 CORS 的 API。 ### 5. DOJO 动画与效果 `dojo/fx` 模块包含了基本的动画效果,如淡入淡出、滑动、旋转等。`dojo.fx.chain` 和 `dojo.fx.combine`...