您的位置:首页 > Web前端 > JQuery

Jquery学习笔记——队列和Data

2011-09-30 15:54 232 查看

队列

jQuery中的queue和dequeue是一组很有用的方法,他们对于一系列需要按次序运行的函数特别有用。特别animate动画,ajax,以及timeout等需要一定时间的函数

queue和dequeue的过程主要是:

1,用queue把函数加入队列(通常是函数数组)

2,用dequeue将函数数组中的第一个函数取出,并执行(用shift()方法取出并执行)
3. 使用clearQueue 将队列清空
也就意味着当再次执行dequeue的时候,得到的是另一个函数了

同时也意味着,如果不执行dequeue,那么队列中的下一个函数永远不会执行
对于一个元素上执行animate方法加动画,jQuery内部也会将其加入名为 fx 的函数队列

而对于多个元素要依次执行动画,则必须我们手动设置队列进行了。
一个例子,要两个div依次向左移动,点击这里查看

div{
background:#aaa;
width:18px;
height:18px;
position:absolute;
top:10px;
}

<divid="block1"></div>
<div id="block2"></div>

如果只是轮流移动次数较少,可以使用animate的回调函数来做,一个动画放在另一个动画的回调里边

比如

$("#block1").animate({left:"+=100"},function(){
$("#block2").animate({left:"+=100"},function() {
$("#block1").animate({left:"+=100"},function() {
$("#block2").animate({left:"+=100"},function() {
$("#block1").animate({left:"+=100"},function(){
alert("动画结束");
});
});
});
});
});

但这种方法当动画较多的时候简直是残忍。
此时利用queue和dequeue则显得简单很多:

varFUNC=[
function() {$("#block1").animate({left:"+=100"},aniCB);},
function() {$("#block2").animate({left:"+=100"},aniCB);},
function() {$("#block1").animate({left:"+=100"},aniCB);},
function() {$("#block2").animate({left:"+=100"},aniCB);},
function() {$("#block1").animate({left:"+=100"},aniCB);},
function(){alert("动画结束")}
];
var aniCB=function(){
$(document).dequeue("myAnimation");
}
$(document).queue("myAnimation",FUNC);
aniCB();

1,我首先建议建立了一个函数数组,里边是一些列需要依次执行的动画

2,然后我定义了一个回调函数,用dequeue方法用来执行队列中的下一个函数

3,接着把这个函数数组放到document上的myAnimation的队列中(可以选择任何元素,我只是为了方便而把这个队列放在document上)

4,最后我开始执行队列中的第一个函数
这样做的好处在于函数数组是线性展开,增减起来非常方便。

而这当然也可以用于ajax之类的方法,如果需要一系列ajax交互,每个ajax都希望在前一个结束之后开始,之前最原始的方法就是用回调函数,但这样太麻烦了。同样利用queue添加队列,每次ajax之后的回调中执行一次dequeue即可。

Data

返回元素上储存的相应名字的数据,可以用data(name, value)来设定。 如果jQuery集合指向多个元素,那将只返回第一个元素的对应数据。这个函数可以用于在一个元素上存取数据而避免了循环引用的风险。 jQuery.data是1.2.3版的新功能。你可以在很多地方使用这个函数,另外jQuery UI里经常使用这个函数。
有 data() removeData() 和hasData() 分别完成get/set 删除和判断的功能

观察源代码的话会发现,该方法没有在HTML中增加任何自定义的属性,而是把数据以隐藏的方式设置的,这样HTML代码就非常干净了,正如文档中所说,如果用于UI的效果设计的话,简直是再合适不过了。

Attribute和Property

attribute是通过 getAttribute()方法可以访问的,而property 是通过 . 访问的。 在1.6中使用 .prop() 操作dom元素,获得property; 使用.attr()获得 attribute.

DeferObject

简单来说,jQuery._Deferred是一个函数队列,他的作用有以下几点:

保存若干个函数。 在特定的时刻把保存着的函数全部执行掉。 执行过后,新进来的函数会立刻执行。可用于异步事件执行的解耦,如在 ajax的success function中执行 fire

感觉是不是和啥东西很像?对,jQuery的ready函数就是这样的逻辑,实际中jQuery 1.5中的ready函数也确实被嫁接到这上面去了。

jQuery._Deferred提供下面的接口:

done:function(fn1, fn2, ...)的形式,用于把函数添加到队列中。 fire:function(context, args)的形式,使用context指定this对象,args指定参数,调用队列中所有函数。fire被调用后,_Deferred会进入isResolved状态,未来对done的调用不会再保存函数,而是直接调用函数。 resolve:相当于调用fire(this, arguments),一个简化的方法。 isResolved:用来判断_Deferred是否在isResolved状态,具体参考前面的fire函数的解释。
cancel:取消掉整个队列,这样不管未来是不是fire,队列中的函数都不会再被调用。

说明白了jQuery._Deferred,再来看看jQuery.Deferred。这个东西其实就是2个_Deferred组成的,第一个称为deferred,用于保管“正常”状态下的函数;第二个称为failDeferred,用于保管“出错”状态下的函数。同时jQuery.Deferred提供了一些新的接口:

then:function(done, fail)的形式,把done添加进deferred,把fail添加进failedDeferred。 fail:相当于failDeferred的done函数。 fireReject:相当于failDeferred的fire函数。 reject:相当于failDeferred的resolve函数。 isRejected:相当于failDeferred的isResolved函数。

同时jQuery.Deferred取消了cancel函数。

那么这个是啥用的呢?有“正常”和“出错”2个状态,同时又是异步的,很容易就能想到……对,给AJAX用的

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: