2008-12-19 143 views
10

我已经使用jquery手风琴插件在页面上设置了一些手风琴,这样我就可以实现全部展开并折叠所有功能。Jquery手风琴关闭然后打开

每个ID元素是它自己的手风琴和下面的代码工作,以全部关闭不管哪些是已经打开:

$("#contact, #address, #email, #sales, #equipment, #notes, #marketingdata") 
    .accordion("activate", -1) 
; 

我的问题是与全部展开。当我把它们都与此代码扩展:

$("#contact, #address, #email, #sales, #equipment, #notes, #marketingdata") 
    .accordion("activate", 0) 
; 

有些人会合同,有的将扩大基于他们是否是以前打开。

我的想法是纠正这个问题,将它们全部折叠起来,然后在点击展开全部时展开它们。然而,这个代码将无法正确执行:

$("#contact, #address, #email, #sales, #equipment, #notes, #marketingdata") 
    .accordion("activate", -1) 
; 
$("#contact, #address, #email, #sales, #equipment, #notes, #marketingdata") 
    .accordion("activate", 0) 
; 

它只会命中第二个命令,并不会先关闭它们。有什么建议么?

回答

32

我不完全确定你在做什么,但这是我最好的猜测。在所有手风琴中,您希望“全部打开”按钮打开所有已关闭的手风琴(即没有部分显示)。我会通过使用filter()

$("#contact, #address, #email, #sales, #equipment, #notes, #marketingdata") 
    .filter(":not(:has(.selected))") 
    .accordion("activate", 0) 
; 

这就是你以后的样子吗?


编辑解释说,过滤功能:

过滤功能只是贯穿过滤您当前选择,消除任何不匹配。它有两种不同的形式:一种是你传入常规jQuery查询,就像我上面所做的一样,另一种是你可以定义一个函数来过滤。如果函数返回false,那么该元素将被删除。

在这种情况下,查询将删除任何没有(:not)拥有的(:has)类别为“selected”(.selected)的孩子。我在这里使用了.selected选择器,因为这是手风琴为当前打开的面板添加的内容。

如果你只有一个手风琴,或者你给每个手风琴某种标识符,比如一个类名,那么你可以大大减少整个脚本。让我们说,对于你想变成手风琴的每一个元素,你都会给它一个“一致”的类。

$(".accord:not(:has(.selected))").accordion("activate", 0); 

这是更为清晰和易于维护,因为你可以很容易地在未来增加更多的手风琴,如果你想,这将处理它。

的过滤器的文档是在这里:http://docs.jquery.com/Traversing/filter

+0

哇!那很完美!你能向我解释.filter代码行吗?它工作的很好,但我真的很想明白它为将来的参考做什么(我是jquery的新手)。谢谢你的帮助! Jon – Jon 2008-12-22 13:25:34

+0

很好的解释!这对未来会有很大的帮助。 – Jon 2008-12-22 15:20:13

0

我有同样的问题,并与一些短代码利用JQuery的每一个()函数,而将焦点设置项[0],这样正常航行可以崩溃解决它恢复。

http://spstring.jeffthink.com/?p=49

2
jQuery('#accordion').accordion({   
    active:-1, 
});