Jquery学习笔记——队列和Data

 队列

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

queue和dequeue的过程主要是:
1,用queue把函数加入队列(通常是函数数组)
2,用dequeue将函数数组中的第一个函数取出,并执行(用shift()方法取出并执行)

3.  使用clearQueue 将队列清空

也就意味着当再次执行dequeue的时候,得到的是另一个函数了
同时也意味着,如果不执行dequeue,那么队列中的下一个函数永远不会执行

对于一个元素上执行animate方法加动画,jQuery内部也会将其加入名为 fx 的函数队列
而对于多个元素要依次执行动画,则必须我们手动设置队列进行了。

一个例子,要两个div依次向左移动,点击这里查看

  1. div{
  2.     background:#aaa;
  3.     width:18px;
  4.     height:18px;
  5.     position:absolute;
  6.     top:10px;
  7. }
  1. <divid="block1"></div>
  2. <div id="block2"></div>

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

  1. $("#block1").animate({left:"+=100"},function(){
  2.     $("#block2").animate({left:"+=100"},function() {
  3.         $("#block1").animate({left:"+=100"},function() {
  4.             $("#block2").animate({left:"+=100"},function() {
  5.                 $("#block1").animate({left:"+=100"},function(){
  6.                     alert("动画结束");
  7.                 });
  8.             });
  9.         });
  10.     });
  11. });

但这种方法当动画较多的时候简直是残忍。

此时利用queue和dequeue则显得简单很多:

  1. varFUNC=[
  2.     function() {$("#block1").animate({left:"+=100"},aniCB);},
  3.     function() {$("#block2").animate({left:"+=100"},aniCB);},
  4.     function() {$("#block1").animate({left:"+=100"},aniCB);},
  5.     function() {$("#block2").animate({left:"+=100"},aniCB);},
  6.     function() {$("#block1").animate({left:"+=100"},aniCB);},
  7.     function(){alert("动画结束")}
  8. ];
  9. var aniCB=function(){
  10.     $(document).dequeue("myAnimation");
  11. }
  12. $(document).queue("myAnimation",FUNC);
  13. 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用的

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值