作者s25g5d4 (死城盗贼)
看板Ajax
标题Re: [闲聊] JQuery的callback与queue
时间Fri Aug 27 18:45:47 2010
※ 引述《JYHuang (夏天到了,冷不起来了说)》之铭言:
: 这几天在写一个grid的功能,遇到了一点小问题。
: 就拿出来讨论一下。
: ╔═╦═╦═╗
: th ║1 ║2 ║3 ║
: ╟─╫─╫─╢
: td ├─┼─┼─┤
: td ├─┼─┼─┤
: td └─┴─┴─┘
: 简单的说,我要做的动作大至上是click th[n]时,
: th跟每列的第n个td都做fadeOut的动作
: 然後再用test()计算table的宽度
: 首先
: $("thead th").click(function(){
: var index =$(this).index();
: $("td:eq("+index+")","tr").fadeOut('slow');
: test();
: });
: 当然..事情没憨人想的这麽简单
: javascript的指令是不会停下来等动作执行完再执行下一行的
其实是jQuery跑特效时不知用了什麽方法使得
程式不会卡在特效跑完才继续
我猜应该是用setTimeout的方式吧...
事实上javascript还是一行跑完才跑下一行的
: 所以fadeOut这种有时间轴的动作会跟test()一起被执行
: 这样一来计算出来的宽度就有误了。
: 所以接着试试看callback
: $("thead th").click(function(){
: var index =$(this).index();
: $("td:eq("+index+")","tr").fadeOut('slow',test);
: });
: 不过问题又来了..
: 要执行的对像是一个集合..
: 所以callback会被每一个子元件重复的执行...
: 此时想到了JQuery还有一个queue的功能..
: 不过看了半天官方API文件还是一头雾水..只好慢慢踹..
: jQuery.queue( $("td:eq("+index+")","tr")[0], "fx", function () {
: test();
: jQuery.dequeue( this );
: });
: 问题在红色的框那里..
: 那个框似乎是指集合的index
: 当集合第index个元件执行完之後才会跑test(),而这里是以元件的集合做动作
: 所以如果照着官方给[0]的话
: 会在第一行的td fadeOut後就执行test了
: 所以要先计算出集合的长度..
: var _len = $("td:eq("+index+")","tr").size()
: jQuery.queue( $("td:eq("+index+")","tr")[_len -1], "fx",....
: 或是直接指向集合的最後一个元件
: jQuery.queue( $("td:eq("+index+")","tr").filter(":last")[0], "fx",.....
: 这边用filter而不是selector中用:last,是因为这是指所以集合中的最後一个
: 直接在Selector中用:last的话,会是指每个tr第index个td的最後一个
: JQuery的selector好复杂 =.=...
其实只要用$(selector).last()就好了~囧
: 另外...
: 那个dequeue的功用到底是?
queue很好很强大 简单的说就是插队就对了~
例如一堆人排队买饮料
一般的店(javascript)都是前面的人先结帐而且拿到饮料
下一个人才能结帐买饮料
而换jQuery开店就变成 一样排队结帐 但是结完帐以後就先去旁边等饮料
换下一个人去结帐 然後去旁边等饮料 下一个又递补上去...
然後现在有个人插队(queue)进去 他很机车
他先等其他结帐完的人拿到饮料离开後才结帐
他结帐完以後就一样去旁边等饮料 其他人继续结帐
而dequeue的意义就是那个插队的人离开的动作
如果用jQuery.queue的方式是一定要加dequeue
不过具体上我也不了解deuqueue到底是什麽意思 @@"
因为$(selector).queue()没加dequeue也会跑阿...
一个简单的范例:
http://jsfiddle.net/9qx9z/2/
刚刚改了一下范例 各位可以注意div#x淡出时 th、td也在淡出
代表即使特效执行中 程式还是继续往下跑 同时div#c也在淡入
而等到th、td淡出效果跑完以後 div#a紧接着写上'%'与'@'
同时block1也在淡出 此时queue插队完 th、td又再度淡入
也就是顺序的去执行特效 以这个范例来说 th、td的顺序是
th、td先是淡出 然後queue插队进来 等到淡出结束以後就换queue执行
queue执行完以後才换淡入执行
--
推 onion0350754:__子,_不异空,空不异__,_即是空,空即是_ 07/27 17:49
推 wannahappy2: 射精 07/27 17:50
推 shirami: 射 07/27 18:02
推 onion0350754: 身寸 07/27 18:04
推 tony1688: 穴 穴 07/27 18:10
推 onion0350754:好糟糕~~!万一_经真的改成那样就GJRZ!!(啊们 07/27 18:14
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.127.208.70
※ 编辑: s25g5d4 来自: 59.127.208.70 (08/27 19:15)