随着Web技术的发展,RIA似乎已经成了主流,Ajax也随之成了不可或缺的部分。Ajax是异步的javascript和Xml,虽然现在很多交互的数据格式都不再严格的采用XML,但这种异步的操作却越来越流行了。目前主流的JS工具包都包含了Ajax的功能,dojo也有自己的Ajax框架XHR。

XHR框架

XHR框架是dojo对ajax支持的一组方法,允许想服务器端发出get、post、put、delete请求,这些方法包括:

  • xhrGet
  • xhrPost
  • xhrPut
  • xhrDelete

所有这些函数都遵守相同的语法:接受一个属性配置对象作为参数。在这些对象中您可以定义您想要发出的 Ajax 请求的各个方面。再一次说明,这些选项在所有 XHR 函数中都是一样的。

比较常用的选项:

  • url:这是 HTTP 请求的 URL。它必须和发出这一请求的页面有同样的域和端口组合。
  • handleAs:允许您定义响应的处理格式,默认是 text,但是,json、javascript、xml、还有一些其他选项也可用。在本节后面您将看到一个创建 Ajax 请求的示例,使用一个处理 JSON 响应格式的回调函数。
  • form:<form> 元素的一个引用或者字符串 ID 表示。form 中每个字段的值将被同请求一起作为请求体发送。
  • content:一个对象,包含您想要传递给请求体中资源的参数。如果两者都提供,这个对象将与从 form 属性中获取的值混合在一起。
  • load:当 Ajax 请求返回一个成功响应消息时,执行此函数。响应数据和请求对象作为参数被传递到这个函数。
  • error:如果 Ajax 请求出现问题,该函数将被调用。如果在 Ajax 请求中定义的 URL 无效、请求超时或者发生其他 HTTP 错误,这将会出现。错误消息和请求对象被作为参数传递。
  • handle:该函数允许您将加载和错误回调函数合并到一个函数中(如果您确实不关心请求结果是成功或是出现错误,这将非常有用)。

这几种类型的请求对于构建一个REST风格的框架很有用,用xhrGet查看数据,xhrPost修改数据,xhrPut创建数据,xhrDelete删除数据,每一种类型的请求对应一种服务器端具体的操作。

使用iframe进行文件上传

XHR对于普通的Web请求具有很强的可操作性,但是对于像异步的上传文件等操作显得比较棘手,不过没关系,dojo已经为我们想到了这些。

dojo通过使用iframe的方式实现了这种高级的数据传输。笔者曾经使用jquery实现过一个通过iframe异步上传文件的程序,其原理是将文件的提交的target设置为iframe,这样在提交时,页面不会刷新,只有当服务器返回时,才会更新iframe中的内容。这种操作会有进度条,但整个页面不会刷新,虽然不是完全的无刷新,但用其实现文件上传绝对的有用。

dojo.io.iframe 是如何工作的呢?除了 XHR 对象之外还有什么方法可以实现表单的异步提交?其实这一切都很简单,dojo.io.iframe 首先会创建一个隐藏的 iframe 并插入到父页面的最后,然后设置此 iframe 的 src 属性为dojo-module-path/resources/blank.html(dojo-module-path 指 dojo 包所在的目录),iframe 页面的 onload 事件的处理函数被设置为父窗体的回调函数。接下来就是在 iframe 页面中发送请求,并接收服务器的响应。当 iframe 接收到服务器的反馈并加载完之后,父窗体的回调函数即被调用。

JSONP:跨域的数据访问

XHR 框架中的函数功能强大,使用方便。但是 XHR 框架的函数有一问题就是不能跨域访问,浏览器不允许 XHR 对象访问其他域的站点。

JSONP(JSONP Padding)就是为了解决跨域访问而产生的:

  • 通过<javascript></javascript>标签访问封装JSON数据的地址
  • 将要返回的数据封装为JSON对象
  • 数据返回给浏览器,并被自动执行

这便是JSONP执行的基本流程,但是想要确定数据是否加载完成并不容易,通常的做法是设置一个回调方法,这个方法的名称被作为请求参数的一部分发送给服务器,服务器在将数据封装完整后,生成回调方法执行的代码,并将这些信息全部返回给客户端,当客户端执行返回数据时,回调方法也会被随之调用。

总结

本文介绍了 Dojo 中三种浏览器与服务器交互的方式,这三种方式各有优缺点,但是在使用方式却出奇的一致; xhr 框架的函数,dojo.io.iframe、dojo.io.script 对象的函数使用的 JSON 对象参数也极其相似,而且浅显易懂。 Dojo 设计者的这一良好设计极大的减轻了开发人员的学习负担,作为框架开发人员应该了解这一理念。

下表是对这三种方式从三个方面进行了比较:

  支持的 HTTP 请求类型 期望的输出 跨域访问
XHR Get, post, delete, put text, json, xml, javascript … N
iframe Get, post html N
script Get javascript Y

综上所述,使用上述三种方法时需要遵循一条简单的原则:传送文件则 iframe,跨域访问则使用动态脚本,其余则选 XHR 框架。

本文是作者学习过程中的总结,部分内容引用自一下地址:

http://www.ibm.com/developerworks/cn/web/wa-lo-dojointro2/

http://www.ibm.com/developerworks/cn/web/wa-ground/

如果认为此文对您有帮助,别忘了支持一下哦!

声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。转载时请在文章页面明显位置给出原文链接。

Dojo入门:增强的Ajax功能的更多相关文章

  1. 模仿JQuery封装ajax功能

    需求分析 因为有时候想提高性能,只需要一个ajax函数,不想引入较大的jq文件,尝试过axios,可是get方法不支持多层嵌套的json,post方式后台接收方式似乎要变..也许是我不太会用吧..其实 ...

  2. Dojo入门:初识Dojo

      Dojo的全称是Dojo Toolkit,始创于2004年,是当前各种蓬勃发展的JS工具包中的佼佼者.Dojo 为富互联网应用程序(RIA) 的开发提供了完整的端到端的解决方案,包括核心的 Jav ...

  3. 14、ASP.NET MVC入门到精通——Ajax

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 Unobtrusive Ajax使用方式(非入侵式) 非入侵式,通俗来讲:就是将嵌入在Html中的JavaScript全部取出来,放在单独的 ...

  4. sublime text3插件增强侧边栏的功能文件的复制粘贴

    快捷键ctrl + shift +p 输入  install package 回车,调出插件搜索器, 在搜索栏中输入 SideBarEnhancements 回车安装插件. 在侧边栏中的各种操作功能增 ...

  5. ASP.NET MVC5入门2之Ajax实现数据查询

    开发环境:VS2013 数据库:SQL Server2008R2 架构:ASP.NET MVC5 开发语言:C# 代码下载链接:http://download.csdn.net/detail/u010 ...

  6. dojo Datagrid 实现数据删除功能

    DataGrid实现数据动态刷新功能见前一个帖子:http://www.cnblogs.com/qq552048250/p/4447103.html 实现数据删除只需要向表格中动态添加按钮,并为按钮的 ...

  7. dojo入门

    1.引入dojo.js dojo的发行包里有4个子目录,要引入的文件是名叫"dojo"的子目录里的dojo.js. 假设你是这样的目录结构: project | +--dojo-l ...

  8. 使用jQuery Ajax功能的时候需要注意的一个问题

    每次jquery的Ajax请求都会创建一个xmlHttprequest对象,理论上讲,长连接(页面需要和服务器保持长连接,而且在连接超时后需要重新请求连接)的请求是一个无限递归,请求数量是非常大的,但 ...

  9. Struts2 整合jQuery实现Ajax功能(1)

    技术领域非常多东西流行,自然有流行的道理.这几天用了jQuery,深感有些人真是聪明绝顶,能将那么多技术融合的如此完美. 首先明白个概念: jQuery是什么:是使用javascript语言开发的,用 ...

随机推荐

  1. 创建CUDA项目

    输出选择X64 .cu文件属性: 常规-项类型:CUDA C/C++ 项目属性: 平台:活动(x64) CUDA C/C++ - Common-Target Machine Platform: 64- ...

  2. idea 下获取路径下文件的方法

    想读取resouce/temp下的test.txt文件.方式一:File sourceFile = ResourceUtils.getFile("classpath:temp/test.tx ...

  3. docker 创建容器时指定容器ip

    Docker创建容器时默认采用bridge网络,自行分配ip,不允许自己指定. 在实际部署中,我们需要指定容器ip,不允许其自行分配ip,尤其是搭建集群时,固定ip是必须的. 我们可以创建自己的bri ...

  4. 使用Vue自定义组件时,报did you register the component correctly? For recursive components, make sure to provide the "name" option.(未注册组件)的原因之一

    错误信息: [Vue warn]: Unknown custom element: <list> - did you register the component correctly? F ...

  5. Acwing-102-最佳牛围栏(二分,实数)

    链接: https://www.acwing.com/problem/content/104/ 题意: 农夫约翰的农场由 N 块田地组成,每块地里都有一定数量的牛,其数量不会少于1头,也不会超过200 ...

  6. 语法注释格式;格式化输出;input在py2和py3中的区别;数据的基本类型;运算符;

    一.Python中的注释 Python的注释是代码的评论,是让代码让人能更加清晰明确.代码的注释可分为单行注释和多行注释,单行注释用“#”,多行注释用三对单引号或者三对双引号来表示. ps:# 单行注 ...

  7. Python 3标准库 第五章 数学运算

    第五章数学运算-----------------------上下文解释:编程时,我们一般也是先给程序定义一些前提(环境变量.描述环境变化的全局变量等),这些“前提”就是上文,然后再编写各功能模块的代码 ...

  8. 【JZOJ5430】【NOIP2017提高A组集训10.27】图

    题目 有一个n个点的无向图,给出m条边,每条边的信息形如\(<x,y,c,r>\) 给出q组询问形如\(<u,v,l,r>\) 接下来解释询问以及边的意义 询问表示,一开始你在 ...

  9. 【leetcode】960. Delete Columns to Make Sorted III

    题目如下: We are given an array A of N lowercase letter strings, all of the same length. Now, we may cho ...

  10. JS 全局作用域和局部作用域

    一.作用域 1.什么是作用域(Scope) 通常来说,一段程序代码中所用到的名字不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域. JS作用域:就是代码名字(变量)作用的范围 ...