- 浏览: 688239 次
- 性别:
- 来自: 合肥
文章分类
最新评论
-
di1984HIT:
学习了,学习了!
Tomcat的URL中文乱码解决以及传输优化 -
arottenapple:
...
我的二十一天CoreJava 学习笔记 -
黯淡流觞:
...
我的二十一天CoreJava 学习笔记 -
onlyOneToOne:
wsc830719 写道@RequestMapping(val ...
spring mvc3中 ResponseBody中文乱码 -
waj_615:
但是打印订单不是简单的string 啊
用java实现打印功能
原文地址:http://dojotoolkit.org/documentation/tutorials/1.7/ajax/
Ajax是一个动态网站的基本功能,在这个教程中,你将会学到如何使用dojo的ajax使用方法,包括了基本的XHR连接,自定义回调函数,处理多类型数据和使用json跨域取值。
开始
由于在dojo,dijit,dojox的多个组件和类中都要用到ajax功能,所以dojo就把ajax方法放到了dojo base类中。但是在操作使用ajax时他的依赖类还是要被指定的。ajax工具类被放置于dojo/_base/xhr这个模块中。下面是示例
// Require the xhr module require(["dojo/_base/xhr"], function(xhr) { // Execute a HTTP GET request xhr.get({ // The URL to request url: "get-message.php", // The method that handles the request's successful result // Handle the response any way you'd like! load: function(result) { alert("The message is: " + result); } }); });
上面的例子演示的是以ajax方式从get-message.php地址中请求数据,如果取值成功将会把返回的信息alert出来。如果取值出问题会怎么样?又或者返回的数据是json或xml格式的我们可以怎么处理?还有,我想要提交一个form的数据将怎么办?xhr都可以完全的处理这样问题。
定制ajax请求
一个web的开发者要能够使用ajax功能来实现不同的请求任务,要能完成以下功能,但不是只限于这些功能
- 从服务器中取得静态数据
- 能处理从服务器中传来的XML或JSON格式的数据
- 能发送数据到服务器
- 能对页面进行局部刷新
- url 要请求的路径
- handleAs 字符串类型,指要以什么样的格式来处理返回的数据,有"text","json","javascript","xml",默认为"text",如果是"javascript"片断的话会在返回后执行它
- timeout 超时时间,以毫秒记,如果超时会触发error方法
- content 以键值对的形式表现的参数,也就是请求参数
- form 一个有同的参数,通过我们都是使用form来提交的,如果你没有使用url而指定的form,那么将会请求form中的action值,同样,如果你使用了content,那么将会不覆盖form中的参数,所有content/form两者选一个,不要同时使用
- load(response,ioArgs) 当请求成功返回值时会调用这个方法。第一个参数是返回值
- error(errorMessage) 当请求失败时会调用该方法,第一个参数是错误信息
- handle(response,ioArgs) 不管是成功还是失败都会调用该方法,load或error先调用,然后再调用该方法
示例
刷新节点内容
require(["dojo/_base/xhr", "dojo/dom", "dojo/domReady!"], function(xhr, dom) { // Using xhr.get, as very little information is being sent xhr.get({ // The URL of the request url: "get-content.php", // The success callback with result from server load: function(newContent) { dom.byId("contentNode").innerHTML = newContent; }, // The error handler error: function() { // Do nothing -- keep old content there } }); });
检查用户名是否可用
// Local var representing the node to be updated var availabilityNode = dom.byId("availabilityNode"); // Using xhr, as very little information is being sent xhr.get({ // The URL of the request url: "check-username.php", // Allow only 2 seconds for username check timeout: 2000, // Send the username to check base on an INPUT node's value content: { username: dom.byId("usernameInput").value.toLowerCase() }, // The success callback with result from server load: function(result) { if(result == "available") { availabilityNode.innerHTML = "Username available!"; } else { availabilityNode.innerHTML = "Username taken! Please try another."; } } });
form提交
// Local var representing if the form has been sent at all var hasBeenSent = false; // Local var representing node to be updated var messageNode = dom.byId("messageNode"); // Using xhr.post, as the amount of data sent could be large xhr.post({ // The URL of the request url: "submission.php", // No content property -- just send the entire form form: dom.byId("contactForm"), // The success handler load: function(response) { messageNode.innerHTML = "Thank you for contacting us!"; }, // The error handler error: function() { messageNode.innerHTML = "Your message could not be sent, please try again." }, // The complete handler handle: function() { hasBeenSent = true; } });
什么是JSON
JSON(Javascript Object Notation) 中一种非标准的数据格式,他可以传送复杂的数据结构。结构中可以包括字符串,数字,布尔值,数组和对象。dojo的xhr是支持json格式的。下面就是一个处理json的小例子
require(["dojo/_base/xhr", "dojo/dom", "dojo/_base/array", "dojo/domReady!"], function(xhr, dom, arrayUtil) { // Keep hold of the container node var containerNode = dom.byId("newsContainerNode"); // Using xhr.get, as we simply want to retrieve information xhr.get({ // The URL of the request url: "get-news.php", // Handle the result as JSON data handleAs: "json", // The success handler load: function(jsonData) { // Create a local var to append content to var content = ""; // For every news item we received... arrayUtil.forEach(jsonData.newsItems, function(newsItem) { // Build data from the JSON content += "<h2>" + newsItem.title + "</h2>"; content += "<p>" + newsItem.summary + "</p>"; }); // Set the content of the news node containerNode.innerHTML = content; }, // The error handler error: function() { containerNode.innerHTML = "News is not available at this time." } }); });
JSON已经被使用了很多年了,而且大多数的服务端语言都支持对json的加密解密。如php就使用json_encode 和 json_decode方法来处理json数据
JSONP和dojo/io/script
对于基本的ajax功能有一个限制,你不能进行跨域请求。比如你不能在你的服务器中使用xhr.get来请求我的服务器地址。但有另一个方法,你可以使用JSONP。其工作方式为
- 创建一个script节点
- 设置script节点的src属性为你要请求的地址,在地址中加入请求参数,还有再加上回调函数名
- script节点会被加载在DOM中,将触发浏览器的一个局部请求
- 服务器返回JSON数据,并按约定包装了回调函数
- 浏览器执行返回的数据,并调用回调函数
// Require the xhr module require(["dojo/io/script", "dojo/on", "dojo/dom", "dojo/_base/array", "dojo/domReady!"], function(script, on, dom, arrayUtil) { // Connect the button on(dom.byId("getJson"), "click", function() { // Output message to DOM var tweetsHolder = dom.byId("tweetsHolder"); // Use the get method script.get({ // The URL to get JSON from Twitter url: "http://search.twitter.com/search.json", // The callback paramater callbackParamName: "callback", // Twitter requires "callback" // The content to send content: { q: "@dojo" // Searching for tweets about Dojo }, // The success callback load: function(tweetsJson) { // Twitter sent us information! // Log the result to console for inspection console.info("Twitter returned: ",tweetsJson); // Output the tweets to a DOM element // Or output a "no tweets" message var message = ""; // If there were tweets returned... if(tweetsJson.results && tweetsJson.results.length) { // Start the list message += "<ul>"; // For every tweet returned arrayUtil.forEach(tweetsJson.results,function(tweet) { message += "<li>" + tweet.from_user + " said: " + tweet.text + "</li>"; }); //End the list message += "</ul>"; } else { // Output "no tweets" message message = "No tweets about Dojo were available."; } // Output message to DOM tweetsHolder.innerHTML = message; }, // Ooops! Error! error: function() { tweetsHolder.innerHTML = "Error! Tweets could not be received."; } }); }); });
最佳实践
- get方法是用于从服务器简单取值的方法,post是用户发送表单数据或大量数据到服务器的方法
- 建议使用error的回调函数,不要期望你的ajax请求是肯定成功的
- 在发送和接收数据的过程中使用console打印到控制台来确保你的数据都是正确的
- 根据经验,在ajax请求中要给用户一点提示,如一个在加载的图标等
结论
dojo减少了跨域请求的大量的工作量,并且通过dojo/_base/xhr提供了非常简单的API。同时也通过dojo/oi/script提供了跨域方法xhr.get和xhr.post
发表评论
-
dojo封装dialog提示框
2012-06-20 10:20 5658/** * 显示dojo的弹出框.前提是已经引用了相 ... -
dojo封装表单ajax提交
2012-06-20 10:16 1715/** * dojo的ajax提交form(post ... -
封装创建dojo的dialog
2012-06-18 13:55 0/** * 显示dojo的弹出框.前提是已经引用了相 ... -
自定义封装dojo通用ajax提交表单
2012-06-18 13:52 2654/** * dojo的ajax提交form(post ... -
使用dojo的dialog自定义confirm效果
2012-06-18 13:43 5125/** * 使用dojo dialog模拟confi ... -
dojo 制做非模态窗口dialog
2012-06-16 13:27 4330dojo的dialog效果基本上都是模态的,也就是说,在弹出窗 ... -
dojo1.7的加载方法
2012-06-01 17:16 4265对于dojo1.7来说,最大的变化就是引入了AMD异步加载器。 ... -
不翻译DOJO了
2012-05-16 17:57 1103翻译DOJO的时间并不长。总是感觉把老外的话翻译过来很是生硬, ... -
dojo1.7翻译 数组工具(Arrays Made Easy)
2012-05-14 10:55 1972英文地址:http://dojotoolkit.org/ ... -
dojo1.7翻译 Dijit的主题,按钮和文本框(Dijit Themes, Buttons, and Textboxes)
2012-05-03 15:52 2214原文地址:http://dojotoolkit.org/ ... -
dojo1.7翻译 动画效果(Animations)
2012-05-02 12:08 2781原文地址:http://dojotoolk ... -
dojo1.7翻译 动态效果(Dojo Effects)
2012-04-27 10:15 1322原文地址:http://dojotoolkit.org/doc ... -
dojo1.7翻译 处理DOM(Dojo DOM Functions)
2012-04-26 15:51 2535原文地址:http://dojotoolkit.org/doc ... -
dojo1.7翻译 ajax跨域请求(Getting Jiggy with JSONP)
2012-04-25 12:02 3161原文地址:http://dojotoolk ... -
dojo1.7翻译 搜索节点功能(Using dojo/query)
2012-04-23 15:32 1910原文地址:http://dojotoolkit.org/doc ... -
dojo1.7翻译 hello,dojo
2012-04-22 15:21 2164原文地址:http://dojotoolkit.org/doc ... -
dojo1.7翻译 定义类(Classy JavaScript with dojo/_base/declare)
2012-04-20 15:34 2561原文地址:http://dojotoolkit.org/doc ... -
dojo1.7翻译 定义模块(Defining Modules)
2012-04-18 17:21 6858原文地址:http://dojotoolkit ... -
dojo1.7翻译 通过dojoConfig来配置dojo
2012-04-18 09:20 5230原文地址:http://dojotoolk ... -
dojo1.7翻译 Hello,World
2012-04-17 10:17 1602原文地址:http://dojotoolkit.org/ref ...
相关推荐
基于Php语言设计并实现了微信小程序的社区门诊管理系统。该小程序基于B/S即所谓浏览器/服务器模式,选择MySQL作为后台数据库去开发并实现一个以微信小程序的社区门诊为核心的系统以及对系统的简易介绍。 用户注册,在用户注册页面通过填写账号、密码、确认密码、姓名、性别、手机、等信息进行注册操作; 用户登录,用户通过登录页面输入账号和密码,并点击登录进行小程序登录操作。 用户登陆微信端后,可以对首页、门诊信息、我的等功能进行详细操作 门诊信息,在门诊信息页面可以查看科室名称、科室类型、医生编号、医生姓名、 职称、坐诊时间、科室图片、点击次数、科室介绍等信息进行预约挂号操作 检查信息,在检查信息页面可以查看检查项目、检查地点、检查时间、检查费用、账号、姓名、医生编号、医生姓名、是否支付、审核回复、审核状态等信息进行支付操作
白色大气风格的设计师作品模板下载.zip
工程经济学自考必备软件下载
UML课程设计报告.doc
白色大气风格响应式彩绘精品水果网站模板.zip
白色简洁风格的别墅整站网站模板.zip
白色简洁风格的APP展示动态源码下载.zip
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;
白色大气风格的雪山旅游景区CSS3网站模板.zip
介绍 基于python开发的大模型调用基础框架(源码) 使用说明 修改配置文件 cd config vim __init__.py # 在配置文件中添加大模型调用地址,模型名称,API_KEY等配置 启动应用 应用启动分为两种模式,命令行模式和web模式 命令行模式 python main.py cli web模式 python main.py api
基于JavaWeb的小区物业管理系统源代码+数据库 负责数据库的设计和界面的设计和实现; 界面使用 BootStrap 框架,页面自适应效果,修改页面后实现各个功能模块的布局; 负责实现用户登录注册,查看小区活动公告、水电费查询、车费查询信息; 采用的技术:采用 MVC 架构,数据库用 MySql;
白色简单风格的商务企业网站模板下载.zip
1. 平台在家电和电子产品方面的营运情况如何? 2. 哪些品牌和类别销量最高? 3. 用户消费规律 4. 哪些是我们的重点用户? 5. 平台有哪些优势和不足,需要如何改进?
全平台数据库管理工具, 支持 ClickHouse, Presto, Trino, MySQL, PostgreSQL, Apache Druid, ElasticSearch...
白色大气风格的旅游整站网站模板.zip
1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用KEIL 标准库开发,当前在STM32F030C8T6运行,如果是STM32F030其他型号芯片,依然适用,请自行更改KEIL芯片型号以及FLASH容量即可。 3、软件下载时,请注意keil选择项是jlink还是stlink。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。 9、编译时请注意提示,请选择合适的编译器版本。
Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
白色大气风格的红唇少女女性类网站模板.zip
白色简洁风格的UIDesign设计公司企业网站模板.rar
Linux期末考试试题.doc