您的位置:首页 > 其它

我的DOJO学习之路(二)

2014-06-06 16:32 281 查看
dojo函数

1.检索 dojo.byid

2.创建 dojo.creat() 参数:节点名,节点的属性,可选的父节点或者兄弟节点,可选的父节点和兄弟节点的相对位置。

demo:

var list=dojo.byId("list")

dojo.create("li",{

innerHTML:"seven";

},list,"after")

3.安插 dojo.place()默认为"last"

function moveFirst(){

var list = dojo.byId("list");

var three = dojo.byId("three");

dojo.place(three, list, "first"); }

4.删除

dojo.destroy();删除一个节点和其所有的子节点

dojo.empty();只删除一个节点的所有子节点

DOM查询和批量操作

dojo.byid查找单个节点。(实际情况中很难为每一个节点起一个唯一的ID)

dojo.query对一组节点进行操作。返回的是一个List数组

常用查询:

用法:var list=dojo.query("#list")[0];返回ID为list的第一个节点

限定查询条件的作用域:

//1.使用选择器来限定查询的作用域

var odds1=dojo.query("#list .odd");

//2.使用第二个参数来限定查询的作用域

var odds2=dojo.query(".odd",dojo.byId("list"));

dojo支持类似Jquery中各种选择器的写法。第一种方法使用了选择器的语法,第二种方法是将一个节点作为限定查询参数传入query方法。使用第一个方法时遍历整个DOM树结构,使用第二种方法则只遍历查询的节点。当文档DOM树并不大时俩种写法一样,当文档dom树很复杂时,使用第二种写法可以提升性能和速度。

更多高级查询:

1,标签名和类名复合使用

var odda=dojo.query("a.odd") 查询class名为odd下的所有a节点

2.">"

//获取任意一个有li节点作为其父节点的a节点 var alla=dojo.query("li a");

//获取任意一个有li节点作为其直接父节点的a节点 var someA=dojo.query("li > a");

常用的操作dojo.query返回的结果集

dojo.query(".odd").forEach(function(node,index,nodelist){

//针对query返回的数组中的每个节点,执行本方法

dojo.addClass(node,"red")

});

其他辅助方法map,filter,some,every,style,toggleClass,replaceClass,place,empty.

事件

connect,用来连接Dom事件

用法: ready(function(){

dojo.query("#demobtn1").onclick(function(){

})

dojo.query("#demobtn2").connect("onclick",function(){

})

})

第一种只支持标准的DOM事件, 第二种支持所有的DOM事件,完整的方法列表(http://dojotoolkit.org/reference-guide/1.9/dojo/NodeList.html#events-with-nodelists

dojo.Deferred(延迟)

dojo.DeferredList(一次处理多个延迟的异步调用)

概念: Deferred对象有三个状态,分别为"unresolve","resolve","reject". 创建deferred对象时,通过then方法注册一个回调函数,当Deferred对象等待的某个事件放生时(resolve),就调用此函数,then方法第二个参数为调用失败或出错时(reject)调用出错的回调函数.

Deferred最重要的功能是实现了服务端数据和AJax请求数据的解耦

Deferred支持链式调用,既可以对返回的对象也调用then函数接受回调函数,可以操作第一次回调函数返回的数据。严格来说的话第一个then返回值并不是Deferred,而是promise(承诺).这样做的好处是假如你需要调用回调函数对原始数据进行操作,就可以直接注册一个回调到Deferred对象上。

DOJO的AJAX对象返回的也是一个Deferred,可以直接使用then函数处理.

dojo.DeferredList 使用场景:从不同来源获取数据,同时对这些数据进行操作。 DeferredList 对象也有一个then方法用来注册回调函数,回调函数的参数是一个tuple构成的数组 每个tuple的第一个值,是一个boolean,表示该Deffered对象所代表的请求是否成功了 即deffered 是否成功resolved 每个tuple的第二个值,是相对应的deferred注册的回调函数的返回值,。

总结:可以使一个异步请求跟后续处理逻辑,可以动态的修改后续处理逻辑,以达到重用的目的。

DEMO:

dojo.require("dojo.DeferredList");
dojo.ready(function(){
// 第一个Ajax请求,产生一个defferred 对象: userDef
var usersDef = dojo.xhrGet({
url: "users.json",
handleAs: "json"
}).then(function(res){
var users = {};
dojo.forEach(res, function(user){
users[user.id] = user;
});
return users;
});
// 另一个Ajax请求,产生第二个defferred 对象: statusesDef
var statusesDef = dojo.xhrGet({
url: "statuses.json",
handleAs: "json"
});
//利用两个Defferred对象构造一个DefferredList对象
var defs = new dojo.DeferredList([usersDef, statusesDef]);
//DeferredList 对象也有一个then方法用来注册回调函数,回调函数的参数是一个tuple构成的数组
// 该回调函数只有当前DefferredList所包含的所有Deferred对象进入Resolved或者Error状态后才会调用。
defs.then(function(results){
// 每个tuple的第二个值,是相对应的deferred注册的回调函数的返回值,
var users = results[0][1],
statuses = results[1][1],
statuslist = dojo.byId("statuslist");
// 每个tuple的第一个值,是一个boolean,表示该Deffered对象所代表的请求是否成功了 即deffered 是否成功resolved
if(!results[0][0] || !results[1][0]){
dojo.create("li", {
innerHTML: "An error occurred"
}, statuslist);
return;
}
dojo.forEach(statuses, function(status){
var user = users[status.userId];
dojo.create("li", {
id: status.id,
innerHTML: user.name + ' said, "' + status.status + '"'
}, statuslist);
});
});
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: