2012-10-11 316 views
29

我在項目中使用了jQuery UI Accordion(其確實不允許在一個時間打開多個項目)。使用手風琴是合適的,因爲我通常只需要一次打開一個面板。jQuery UI Accordion展開/摺疊全部

但是,我需要提供一個「全部展開」鏈接,點擊時切換到「摺疊全部」。我不想自定義圍繞這一要求編寫幾乎相同的手風琴功能,所以我希望一些JS能夠實現這一點,同時保持Accordion組件的使用。

問題:需要JavaScript/jQuery來達到此目的,同時仍然使用jQuery UI「Accordion」組件來支持標準功能?

這裏有一個小提琴:http://jsfiddle.net/alecrust/a6Cu7/

回答

5

在我發現這是最好的解決方案考慮要求結束:

// Expand/Collapse all 
$('.accordion-expand-collapse a').click(function() { 
    $('.accordion .ui-accordion-header:not(.ui-state-active)').next().slideToggle(); 
    $(this).text($(this).text() == 'Expand all' ? 'Collapse all' : 'Expand all'); 
    $(this).toggleClass('collapse'); 
    return false; 
}); 
+0

複製此內容並在您的小提琴鏈接上運行,無法正常工作...以下代碼適用於您的小提琴鏈接'$('。accordion-expand-all a')。click(function(){ $ #accordion .ui-accordion-header:not(.ui-state-active)')。next()。slideToggle(); $(this).text($(this).text()=='Expand all '''全部收起':'全部展開'); $(this).toggleClass('collapse'); return false; });' –

+0

如果存在嵌套的手風琴?此代碼是否可以工作? –

3

我不相信你可以用手風琴做到這一點,因爲它是專門保留頂多一個項目將被打開的屬性。然而,即使你說你不想重新實施手風琴,你也可能過於估計所涉及的複雜性。

考慮以下情況,你有元素的垂直堆疊,

++++++++++++++++++++ 
+  Header 1  + 
++++++++++++++++++++ 
+     + 
+  Item 1  + 
+     + 
++++++++++++++++++++ 
+  Header 2  + 
++++++++++++++++++++ 
+     + 
+  Item 2  + 
+     + 
++++++++++++++++++++ 

如果你懶,你可以建立這個使用表,否則,適當風格的DIV也會起作用。

每個項目塊可以有一類itemBlock。點擊標題將會導致類itemBlock的所有元素被隱藏($(".itemBlock").hide())。然後,您可以使用jquery slideDown()函數展開標題下的項目。現在你已經實現了手風琴。

要展開所有項目,只需使用$(".itemBlock").show()或者如果你想動畫,$(".itemBlock").slideDown(500)。要隱藏所有項目,請使用$(".itemBlock").hide()

+0

謝謝,我很可能與此去,如果一切都失敗了。仍然抱着希望的功能,可以添加標準的手風琴:) – AlecRust

+0

不幸的是,「只有1打開」功能[基本](https://github.com/jquery/jquery-ui/blob/master/ui /jquery.ui.accordion.js#L105-L116)到jquery ui手風琴,並且不能在不覆蓋'_create'的情況下將其刪除,這實際上意味着將小部件分叉。我已經爲你解決了所有問題。 – Sinetheta

+0

我覺得整個小部件都需要分叉,這似乎很奇怪。我希望jQuery UI Accordion的所有現有功能(包括它的每個部分,包括一次只打開一個面板),但能夠使用按鈕展開所有面板。也許這只是一個完全禁用手風琴小部件來渲染所有物品的問題? – AlecRust

47

As discussed在jQuery UI論壇中,您不應該對此使用手風琴。

如果你想看起來像手風琴一樣的東西,那很好。使用他們的類來設計它們,並實現您需要的任何功能。然後添加一個按鈕來打開或關閉它們都非常簡單。 Example

HTML

通過使用jQuery UI類,我們保持我們的手風琴看着就像 「真正的」 手風琴。

<div id="accordion" class="ui-accordion ui-widget ui-helper-reset"> 
    <h3 class="accordion-header ui-accordion-header ui-helper-reset ui-state-default ui-accordion-icons ui-corner-all"> 
     <span class="ui-accordion-header-icon ui-icon ui-icon-triangle-1-e"></span> 
     Section 1 
    </h3> 
    <div class="ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom"> 
     Content 1 
    </div> 
</div>​ 

推出自己的手風琴

主要是我們只想手風琴頭切換以下的兄弟姐妹,這是它的內容區域的狀態。我們還添加了兩個自定義事件「顯示」和「隱藏」,我們將在稍後介紹。

var headers = $('#accordion .accordion-header'); 
var contentAreas = $('#accordion .ui-accordion-content ').hide(); 
var expandLink = $('.accordion-expand-all'); 

headers.click(function() { 
    var panel = $(this).next(); 
    var isOpen = panel.is(':visible'); 

    // open or close as necessary 
    panel[isOpen? 'slideUp': 'slideDown']() 
     // trigger the correct custom event 
     .trigger(isOpen? 'hide': 'show'); 

    // stop the link from causing a pagescroll 
    return false; 
}); 

展開/收起所有

我們使用一個布爾isAllOpen標誌當按鈕已被更改爲標記,這可以很容易地是一個類,或者一個更大的插件的狀態變量框架。

expandLink.click(function(){ 
    var isAllOpen = $(this).data('isAllOpen'); 

    contentAreas[isAllOpen? 'hide': 'show']() 
     .trigger(isAllOpen? 'hide': 'show'); 
}); 

交換按鈕時,「全部打開」

由於我們自定義的「顯示」和「隱藏」的事件,我們有話要聽,當面板正在改變。唯一的特殊情況是「它們全部打開」,如果是,該按鈕應該是「全部摺疊」,否則應該是「全部展開」。

contentAreas.on({ 
    // whenever we open a panel, check to see if they're all open 
    // if all open, swap the button to collapser 
    show: function(){ 
     var isAllOpen = !contentAreas.is(':hidden'); 
     if(isAllOpen){ 
      expandLink.text('Collapse All') 
       .data('isAllOpen', true); 
     } 
    }, 
    // whenever we close a panel, check to see if they're all open 
    // if not all open, swap the button to expander 
    hide: function(){ 
     var isAllOpen = !contentAreas.is(':hidden'); 
     if(!isAllOpen){ 
      expandLink.text('Expand all') 
      .data('isAllOpen', false); 
     } 
    } 
});​ 

編輯發表評論: 維持「1個面板只開放」,除非你點擊「全部展開」按鈕實際上是容易得多。 Example

+0

謝謝你。正如所解釋的,我明白我*不應該使用手風琴,但我的問題是它是否可能**在現有的jQuery UI Accordion組件的頂部。如果你的jQuery相當多的jQuery產生了與jQuery UI相同的手風琴(一次只能打開一個面板等),那將是一回事,但事實並非如此。 – AlecRust

+2

這可能嗎?簡單回答是不。你可以在很多獨立的地方編輯源代碼,但是沒有使用它,這就是重寫它。是的,「大」是相對的。 jQuery ui手風琴的源代碼是738行代碼,這只是因爲它構建在jquery.ui.core.js和jquery.ui.widget.js上 – Sinetheta

+0

非常感謝。有趣的是看看這是否可能,謝謝你的回覆。 – AlecRust

1

嘗試這一個jquery-multi-open-accordion,可以幫助你

+0

謝謝你,我試了一下,但不幸的是它已經過時了最新的jQuery/jQuery UI庫,並且不再與最新版本兼容。 – AlecRust

+0

可能會嘗試這個小提琴http://jsfiddle.net/AR57Y/ –

+0

這個作品很好,除了沒有標準的手風琴功能(一次只打開一個面板)。我希望它與jQuery UI Accordion相匹配,但也提供覆蓋按鈕來展開所有面板。 – AlecRust

17

這是我的解決方案:

在實際工作項目。

$(function() { 
    $("#accordion").accordion({collapsible:true, active:false}); 
    $('.open').click(function() { 
     $('.ui-accordion-header').removeClass('ui-corner-all').addClass('ui-accordion-header-active ui-state-active ui-corner-top').attr({'aria-selected':'true','tabindex':'0'}); 
     $('.ui-accordion-header .ui-icon').removeClass('ui-icon-triangle-1-e').addClass('ui-icon-triangle-1-s'); 
     $('.ui-accordion-content').addClass('ui-accordion-content-active').attr({'aria-expanded':'true','aria-hidden':'false'}).show(); 
     $(this).hide(); 
     $('.close').show(); 
    }); 
    $('.close').click(function() { 
     $('.ui-accordion-header').removeClass('ui-accordion-header-active ui-state-active ui-corner-top').addClass('ui-corner-all').attr({'aria-selected':'false','tabindex':'-1'}); 
     $('.ui-accordion-header .ui-icon').removeClass('ui-icon-triangle-1-s').addClass('ui-icon-triangle-1-e'); 
     $('.ui-accordion-content').removeClass('ui-accordion-content-active').attr({'aria-expanded':'false','aria-hidden':'true'}).hide(); 
     $(this).hide(); 
     $('.open').show(); 
    }); 
    $('.ui-accordion-header').click(function() { 
     $('.open').show(); 
     $('.close').show(); 
    }); 
}); 

http://jsfiddle.net/bigvax/hEApL/

+3

嗨bigvax,jsfiddle鏈接很好,但我沒有幾個問題:這裏是場景:1)點擊「第1部分」打開它。 2)單擊「全部摺疊」按鈕關閉以前打開的部分。 3)現在再次點擊「第1部分」,它不會在第一次點擊時打開,您必須點擊「兩次」。我試圖解決它,但不能。你能告訴我如何解決這個問題? – jeewan

+0

我和@jeewan有同樣的問題 – DontFretBrett

+0

這是正確的答案。謝謝! –

0
Yes, it is possible. Put all div in separate accordion class as follows: 

<script type="text/javascript" src="jquery.js"></script> 
<script type="text/javascript" src="jquery-ui.js"></script> 

<script type="text/javascript"> 

     $(function() { 
      $("input[type=submit], button") 
     .button() 
     .click(function (event) { 
      event.preventDefault(); 
     }); 
      $("#tabs").tabs(); 
      $(".accordion").accordion({ 
       heightStyle: "content", 

       collapsible: true, 
       active: 0 



      }); 
     }); 

function expandAll() 
{ 
    $(".accordion").accordion({ 
       heightStyle: "content", 

       collapsible: true, 
       active: 0 

      }); 

      return false; 
} 

function collapseAll() 
{ 
    $(".accordion").accordion({ 
       heightStyle: "content", 

       collapsible: true, 
       active: false 



      }); 
      return false; 
} 
</script> 



<div class="accordion"> 
    <h3>Toggle 1</h3> 
    <div > 
    <p>text1.</p> 
    </div> 
</div> 
<div class="accordion"> 
    <h3>Toggle 2</h3> 
    <div > 
    <p>text2.</p> 
    </div> 
</div> 
<div class="accordion"> 
    <h3>Toggle 3</h3> 
    <div > 
    <p>text3.</p> 
    </div> 
</div> 
2

這是一個被Sinetheta代碼轉換爲jQuery插件: 保存下面的代碼到一個js文件。

$.fn.collapsible = function() { 
    $(this).addClass("ui-accordion ui-widget ui-helper-reset"); 
    var headers = $(this).children("h3"); 
    headers.addClass("accordion-header ui-accordion-header ui-helper-reset ui-state-active ui-accordion-icons ui-corner-all"); 
    headers.append('<span class="ui-accordion-header-icon ui-icon ui-icon-triangle-1-s">'); 
    headers.click(function() { 
     var header = $(this); 
     var panel = $(this).next(); 
     var isOpen = panel.is(":visible"); 
     if(isOpen) { 
      panel.slideUp("fast", function() { 
       panel.hide(); 
       header.removeClass("ui-state-active") 
        .addClass("ui-state-default") 
        .children("span").removeClass("ui-icon-triangle-1-s") 
         .addClass("ui-icon-triangle-1-e"); 
      }); 
     } 
     else { 
      panel.slideDown("fast", function() { 
       panel.show(); 
       header.removeClass("ui-state-default") 
        .addClass("ui-state-active") 
        .children("span").removeClass("ui-icon-triangle-1-e") 
         .addClass("ui-icon-triangle-1-s"); 
      }); 
     } 
    }); 
}; 

參考它在你的UI頁面,並呼籲類似jQuery的手風琴電話:

$("#accordion").collapsible(); 

看起來更清潔,避免任何類都被添加到標記。

1

我第二bigvax意見的前面,但你需要確保你添加

 jQuery("#jQueryUIAccordion").({ active: false, 
           collapsible: true }); 

否則您將無法倒塌他們之後打開第一手風琴。

$('.close').click(function() { 
    $('.ui-accordion-header').removeClass('ui-accordion-header-active ui-state-active ui-corner-top').addClass('ui-corner-all').attr({'aria-selected':'false','tabindex':'-1'}); 
    $('.ui-accordion-header .ui-icon').removeClass('ui-icon-triangle-1-s').addClass('ui-icon-triangle-1-e'); 
    $('.ui-accordion-content').removeClass('ui-accordion-content-active').attr({'aria-expanded':'false','aria-hidden':'true'}).hide(); 
    } 
0

你可以試試這個輕量級的小插件。

它將允許您根據您的要求對其進行定製。它將具有展開/摺疊功能。

網址:http://accordion-cd.blogspot.com/

0

我發現AlecRust的解決方案非常有幫助的,但我添加的東西來解決一個問題:當你在一個單一的手風琴單擊展開它,然後你點擊按鈕展開,他們將全部被打開。但是,如果再次單擊按鈕以摺疊,單手風琴之前展開的內容將不會崩潰。

我已經使用了imageButton,但是您也可以將該邏輯應用於按鈕。

/*** Expand all ***/ 
$(".expandAll").click(function (event) { 
    $('.accordion .ui-accordion-header:not(.ui-state-active)').next().slideDown(); 

    return false; 
}); 

/*** Collapse all ***/ 
$(".collapseAll").click(function (event) { 
    $('.accordion').accordion({ 
     collapsible: true, 
     active: false 
    }); 

    $('.accordion .ui-accordion-header').next().slideUp(); 

    return false; 
}); 

此外,如果你有一個手風琴內手風琴,要展開所有隻在第二個層次,你可以添加查詢:

/*** Expand all Second Level ***/ 
$(".expandAll").click(function (event) { 
    $('.accordion .ui-accordion-header:not(.ui-state-active)').nextAll(':has(.accordion .ui-accordion-header)').slideDown(); 

    return false; 
}); 
8

很多這些似乎過於複雜。我實現了我想要的東西只有以下幾點:

$(".ui-accordion-content").show(); 

JSFiddle

+0

你打敗了我。我無意中發現了這個。 –

+0

我愛你的解決方案,感謝分享。 – ionize

+0

$(「。ui-accordion-content」)。slideDown(300); – Carel

0

使用有關TAIFUN, 一個例子,我修改,以便展開和摺疊。

... //掛鉤的展開/摺疊所有

var expandLink = $('.accordion-expand-all'); 

expandLink.click(function() { 

$(".ui-accordion-content").toggle(); 
}); 
+0

不清楚的解決方案 – 2017-04-21 05:56:24