作者JYHuang (夏天到了,冷不起来了说)
看板Ajax
标题[闲聊] JQuery的callback与queue
时间Wed Aug 25 11:41:14 2010
这几天在写一个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的指令是不会停下来等动作执行完再执行下一行的
所以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好复杂 =.=...
另外...
那个dequeue的功用到底是?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.39.160.84
※ 编辑: JYHuang 来自: 114.39.160.84 (08/25 11:45)
1F:推 shonbn:值312元 XD 08/25 23:11
2F:→ shonbn:这样讨论没刚好作过有点困难 如果有档案可以跑跑看比较方便 08/25 23:12