jQuery UI หีบเพลงที่เปิดหลายส่วน?


93

ฉันอาจจะเป็นคนงี่เง่า แต่คุณจะเปิดหีบเพลงของ jQuery UI ไว้ได้อย่างไร การสาธิตทั้งหมดเปิดได้ครั้งละหนึ่งรายการเท่านั้น ... ฉันกำลังมองหาระบบประเภทเมนูที่ยุบได้



ปลั๊กอินของคุณสมบูรณ์แบบ! ขอบคุณมากเพื่อน!
SexyBeast

คำตอบ:


94

นี้ถูกกล่าวถึงเดิมในเอกสาร jQuery UI สำหรับหีบเพลง :

หมายเหตุ: หากคุณต้องการเปิดหลายส่วนพร้อมกันอย่าใช้หีบเพลง

หีบเพลงไม่อนุญาตให้เปิดแผงเนื้อหามากกว่าหนึ่งแผงในเวลาเดียวกันและต้องใช้ความพยายามอย่างมากในการดำเนินการดังกล่าว หากคุณกำลังมองหาวิดเจ็ตที่อนุญาตให้เปิดแผงเนื้อหามากกว่าหนึ่งแผงอย่าใช้สิ่งนี้ โดยปกติจะสามารถเขียนด้วย jQuery สองสามบรรทัดแทนดังนี้:

jQuery(document).ready(function(){
  $('.accordion .head').click(function() {
      $(this).next().toggle();
      return false;
  }).next().hide();
});

หรือเคลื่อนไหว:

jQuery(document).ready(function(){
  $('.accordion .head').click(function() {
      $(this).next().toggle('slow');
      return false;
  }).next().hide();
});

"ฉันอาจจะเป็นคนงี่เง่า" - คุณไม่ใช่คนงี่เง่าถ้าคุณไม่อ่านเอกสาร แต่ถ้าคุณมีปัญหาก็มักจะหาทางแก้ไขได้เร็วขึ้น


9
โซลูชันนี้ไม่ได้ทำสไตล์หีบเพลงใด ๆ
forresto

12
นอกจากนี้นี่ไม่ใช่คำตอบสำหรับคำถามเลย หีบเพลง docu และรายการตัวเลือกเหตุการณ์ ฯลฯ นั้นแย่มาก และแทนที่จะบอกผู้ใช้ว่า "ถ้าเราไม่มีตัวเลือกให้คุณอย่าใช้มัน!" พวกเขาควรจะพูดว่า "ขออภัยที่ยังไม่มีตัวเลือกสำหรับสิ่งนั้น แต่เรายินดีต้อนรับผู้มีส่วนร่วมที่เพิ่มฟังก์ชันการทำงานให้กับปลั๊กอินที่ยอดเยี่ยมของเรา"
artgrohe

ข้อความที่ฉันยกมาถูกลบออกจากเอกสาร ฉันเพิ่มลิงก์ไปยังเวอร์ชันที่เก็บถาวร
MvanGeest

1
โปรดทราบว่า jQuery UI Accordion ทำมากกว่าการสร้างเอฟเฟกต์หีบเพลงจริง นอกจากนี้ยังเพิ่มมาร์กอัปการช่วยการเข้าถึงมากมายสำหรับโปรแกรมอ่านหน้าจอ
Brian

2
นี่ไม่สมเหตุสมผลเลย หีบเพลงสามารถเปิดจีบทั้งหมดได้หากแขนของนักดนตรีอยู่ห่างกันจีบทั้งหมดจะปิดหากเครื่องดนตรีอยู่ด้วยกันครึ่งหนึ่งหรือมีอะไรอยู่ระหว่าง หากคำมีความหมายอะไรการควบคุม UI ของซอฟต์แวร์หีบเพลงควรอนุญาตให้ใช้แผงแบบเปิดและแบบปิดร่วมกันได้
birdus

119

ค่อนข้างง่าย:

<script type="text/javascript">
    (function($) {
        $(function() {
            $("#accordion > div").accordion({ header: "h3", collapsible: true });
        })
    })(jQuery);
</script>

<div id="accordion">
    <div>
        <h3><a href="#">First</a></h3>
        <div>Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.</div>
    </div>
    <div>
        <h3><a href="#">Second</a></h3>
        <div>Phasellus mattis tincidunt nibh.</div>
    </div>
    <div>
        <h3><a href="#">Third</a></h3>
        <div>Nam dui erat, auctor a, dignissim quis.</div>
    </div>
</div>

1
ทำงานได้ดี ผมเพิ่ม create: function(event) { $(event.target).accordion( "activate", false ); }เริ่มยุบ
forresto

2
น่ากลัว ดีใจที่ได้ผลสำหรับคุณ :) ฉันชอบที่จะทำให้สิ่งต่างๆเรียบง่ายที่สุด
2upmedia

7
ใน jquery-ui 1.10 เพื่อเริ่มยุบแทนที่จะ create: function(event) { $(event.target).accordion( "activate", false ); }ตั้งค่าตัวเลือก:{active: false}
damko

16
(facepalm) แยกหีบเพลงสำหรับแต่ละบล็อก
Paul Annekov

2
นี่คือ jsFiddle ที่ฉันใช้ในการทดสอบjsfiddle.net/txo8rx3q/1ฉันยังเพิ่ม CSS บางส่วนเพื่อหยุดส่วนหีบเพลงที่เปิดอยู่ซึ่งมองว่าเลือกเมื่อขยายแล้ว
Matthew Lock

78

โพสต์สิ่งนี้ในชุดข้อความที่คล้ายกัน แต่คิดว่าอาจเกี่ยวข้องที่นี่เช่นกัน

บรรลุสิ่งนี้ด้วย jQuery-UI Accordion เพียงอินสแตนซ์เดียว

ดังที่ผู้อื่นกล่าวไว้Accordionวิดเจ็ตไม่มีตัวเลือก API ให้ทำสิ่งนี้โดยตรง อย่างไรก็ตามหากคุณต้องใช้วิดเจ็ตด้วยเหตุผลบางประการ(เช่นคุณกำลังบำรุงรักษาระบบที่มีอยู่) คุณสามารถทำได้โดยใช้beforeActivateตัวเลือกตัวจัดการเหตุการณ์เพื่อล้มล้างและจำลองพฤติกรรมเริ่มต้นของวิดเจ็ต

ตัวอย่างเช่น:

$('#accordion').accordion({
    collapsible:true,

    beforeActivate: function(event, ui) {
         // The accordion believes a panel is being opened
        if (ui.newHeader[0]) {
            var currHeader  = ui.newHeader;
            var currContent = currHeader.next('.ui-accordion-content');
         // The accordion believes a panel is being closed
        } else {
            var currHeader  = ui.oldHeader;
            var currContent = currHeader.next('.ui-accordion-content');
        }
         // Since we've changed the default behavior, this detects the actual status
        var isPanelSelected = currHeader.attr('aria-selected') == 'true';

         // Toggle the panel's header
        currHeader.toggleClass('ui-corner-all',isPanelSelected).toggleClass('accordion-header-active ui-state-active ui-corner-top',!isPanelSelected).attr('aria-selected',((!isPanelSelected).toString()));

        // Toggle the panel's icon
        currHeader.children('.ui-icon').toggleClass('ui-icon-triangle-1-e',isPanelSelected).toggleClass('ui-icon-triangle-1-s',!isPanelSelected);

         // Toggle the panel's content
        currContent.toggleClass('accordion-content-active',!isPanelSelected)    
        if (isPanelSelected) { currContent.slideUp(); }  else { currContent.slideDown(); }

        return false; // Cancels the default action
    }
});

ดูการสาธิต jsFiddle


6
ขอบคุณ! นี่เป็นทางออกที่ดีที่สุดเนื่องจากคุณไม่จำเป็นต้องเปลี่ยนแปลงสภาพแวดล้อมที่มีอยู่ทั้งหมด
artgrohe

ต้องใช้ jQuery UI 1.9.0+ (Drupal 7 ติดอยู่กับ 1.8.7)
Capi Etheriel

1
ฉันเชื่อว่าคลาสที่ใช้งานมีการเปลี่ยนแปลงui-accordion-header-active
Tim Vermaelen

ใช้งานได้ดีสำหรับฉันการปรับโครงสร้างใหม่ :-)
Darkloki

ทางออกที่ดีปัญหาเดียวคือโซลูชันนี้จะไม่ใช้ตัวเลือกไอคอน :-)
Tachyons

21

หรือง่ายกว่านั้น?

<div class="accordion">
    <h3><a href="#">First</a></h3>
    <div>Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.</div>
</div>    
<div class="accordion">
    <h3><a href="#">Second</a></h3>
    <div>Phasellus mattis tincidunt nibh.</div>
</div>         
<div class="accordion">
    <h3><a href="#">Third</a></h3>
    <div>Nam dui erat, auctor a, dignissim quis.</div>
</div>
<script type="text/javascript">
    $(".accordion").accordion({ collapsible: true, active: false });
</script>

นี่คือ imho ที่ดี วิธีแก้ปัญหาที่ง่ายและแก้ไขปัญหาที่ฉันประสบกับการแสดงหีบเพลงจำนวนมาก การเริ่มต้นหีบเพลงชุดใหญ่ทำได้ดีอย่างน่าประหลาดใจ ขอบคุณ!
Code Novitiate

14

ฉันได้ทำปลั๊กอิน jQuery ที่มีหน้าตาเหมือนกันของ jQuery UI Accordion และสามารถเปิดแท็บ \ ส่วนทั้งหมดได้

คุณสามารถหาได้ที่นี่

http://anasnakawa.wordpress.com/2011/01/25/jquery-ui-multi-open-accordion/

ทำงานร่วมกับมาร์กอัปเดียวกัน

<div id="multiOpenAccordion">
        <h3><a href="#">tab 1</a></h3>
        <div>Lorem ipsum dolor sit amet</div>
        <h3><a href="#">tab 2</a></h3>
        <div>Lorem ipsum dolor sit amet</div>
</div>

รหัส Javascript

$(function(){
        $('#multiOpenAccordion').multiAccordion();
       // you can use a number or an array with active option to specify which tabs to be opened by default:
       $('#multiOpenAccordion').multiAccordion({ active: 1 });
       // OR
       $('#multiOpenAccordion').multiAccordion({ active: [1, 2, 3] });

       $('#multiOpenAccordion').multiAccordion({ active: false }); // no opened tabs
});

อัปเดต: ปลั๊กอินได้รับการอัปเดตเพื่อรองรับตัวเลือกแท็บเริ่มต้นที่ใช้งานอยู่

UPDATE: ปลั๊กอินนี้เลิกใช้งานแล้ว


ทางออกที่ยอดเยี่ยม
Trimantra Software Solution

6

จริงๆแล้วกำลังค้นหาทางอินเทอร์เน็ตเพื่อหาวิธีแก้ปัญหานี้มาระยะหนึ่งแล้ว และคำตอบที่ได้รับการยอมรับจะให้คำตอบที่ดี "ตามหนังสือ" แต่ฉันไม่ต้องการยอมรับสิ่งนั้นฉันจึงค้นหาต่อไปและพบสิ่งนี้:

http://jsbin.com/eqape/1601/edit - ตัวอย่างสด

ตัวอย่างนี้ดึงสไตล์ที่เหมาะสมและเพิ่มฟังก์ชันการทำงานที่ร้องขอในเวลาเดียวกันพร้อมด้วยช่องว่างสำหรับเขียนเพิ่มฟังก์ชันการทำงานของคุณเองในการคลิกส่วนหัวแต่ละครั้ง ยังอนุญาตให้หลาย div อยู่ระหว่าง "h3" s

 $("#notaccordion").addClass("ui-accordion ui-accordion-icons ui-widget ui-helper-reset")
  .find("h3")
    .addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-top ui-corner-bottom")
    .hover(function() { $(this).toggleClass("ui-state-hover"); })
    .prepend('<span class="ui-icon ui-icon-triangle-1-e"></span>')
    .click(function() {
      $(this).find("> .ui-icon").toggleClass("ui-icon-triangle-1-e ui-icon-triangle-1-s").end()


        .next().toggleClass("ui-accordion-content-active").slideToggle();
        return false;
    })
    .next()
      .addClass("ui-accordion-content  ui-helper-reset ui-widget-content ui-corner-bottom")
      .hide();

รหัส HTML:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Toggle Panels (not accordion) using ui-accordion  styles</title>

<!-- jQuery UI  |  http://jquery.com/  http://jqueryui.com/  http://jqueryui.com/docs/Theming  -->
<style type="text/css">body{font:62.5% Verdana,Arial,sans-serif}</style>
<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/themes/base/jquery-ui.css" rel="stylesheet" type="text/css" />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/jquery-ui.min.js"></script>


</head>
<body>

<h1>Toggle Panels</h1>
<div id="notaccordion">
  <h3><a href="#">Section 1</a></h3>
  <div class="content">
    Mauris mauris  ante, blandit et, ultrices a, suscipit eget, quam. Integer
    ut neque. Vivamus  nisi metus, molestie vel, gravida in, condimentum sit
    amet, nunc. Nam a  nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut
    odio. Curabitur  malesuada. Vestibulum a velit eu ante scelerisque vulputate.
  </div>
  <h3><a href="#">Section 2</a></h3>
  <div>
    Sed non urna. Donec et ante. Phasellus eu ligula.  Vestibulum sit amet
    purus. Vivamus hendrerit, dolor at aliquet laoreet,  mauris turpis porttitor
    velit, faucibus interdum tellus libero ac justo.  Vivamus non quam. In
    suscipit faucibus urna.
  </div>
  <h3><a href="#">Section 3</a></h3>
  <div class="top">
  Top top top top
  </div>
  <div class="content">
    Nam enim risus, molestie et, porta ac, aliquam ac,  risus. Quisque lobortis.
    Phasellus pellentesque purus in massa. Aenean in pede.  Phasellus ac libero
    ac tellus pellentesque semper. Sed ac felis. Sed  commodo, magna quis
    lacinia ornare, quam ante aliquam nisi, eu iaculis leo  purus venenatis dui.
    <ul>
      <li>List item one</li>
      <li>List item two</li>
      <li>List item  three</li>
    </ul>
  </div>
  <div class="bottom">
  Bottom bottom bottom bottom
  </div>
  <h3><a href="#">Section 4</a></h3>
  <div>
    Cras dictum. Pellentesque habitant morbi tristique  senectus et netus
    et malesuada fames ac turpis egestas. Vestibulum ante  ipsum primis in
    faucibus orci luctus et ultrices posuere cubilia Curae;  Aenean lacinia
    mauris vel est.
    Suspendisse eu nisl. Nullam ut libero. Integer  dignissim consequat lectus.
    Class aptent taciti sociosqu ad litora torquent per  conubia nostra, per
    inceptos himenaeos.
  </div>
</div>

</body>
</html>`

5

ฉันพบวิธีแก้ปัญหาที่ยุ่งยาก ให้เรียกใช้ฟังก์ชันเดียวกันสองครั้ง แต่ใช้ id ต่างกัน

รหัส jQuery

$(function() {
    $( "#accordion1" ).accordion({
        collapsible: true, active: false, heightStyle: "content"
    });
    $( "#accordion2" ).accordion({
        collapsible: true, active: false, heightStyle: "content"
    });
});

รหัส HTML

<div id="accordion1">
    <h3>Section 1</h3>
    <div>Section one Text</div>
</div>
<div id="accordion2">   
    <h3>Section 2</h3>
    <div>Section two Text</div>
</div>

2
คุณจะดีกว่าที่จะใช้ตัวเลือกเดียวตามที่classคนอื่นแนะนำนั่นหมายความว่าคุณจะไม่ทำซ้ำ ( DRY )
Scotty.NET

4

ง่าย ๆ สร้างแอคคอร์เดียน div แต่ละอันแทนแท็กจุดยึดเช่น:

<div>
<div class="accordion">
<a href = "#">First heading</a>
</div>
<div class="accordion">
<a href = "#">First heading</a>
</div>
</div>

มันเพิ่มมาร์กอัปบางอย่าง แต่ใช้งานได้อย่างมือโปร ...


4

ง่าย: ใช้งานหีบเพลงกับชั้นเรียนจากนั้นสร้าง div ด้วยสิ่งนี้เช่นอินสแตนซ์หีบเพลงทวีคูณ

แบบนี้:

JS

$(function() {
    $( ".accordion" ).accordion({
        collapsible: true,
        clearStyle: true,
        active: false,
    })
});

HTML

<div class="accordion">
    <h3>Title</h3>
    <p>lorem</p>
</div>
<div class="accordion">
    <h3>Title</h3>
    <p>lorem</p>
</div>
<div class="accordion">
    <h3>Title</h3>
    <p>lorem</p>
</div>

https://jsfiddle.net/sparhawk_odin/pm91whz3/


1
ฉันลองใช้คำตอบทั้งหมดในเธรดแล้วและได้ผลดีที่สุด ด้วย jquery และ jqueryUI ล่าสุดมีปัญหาเกี่ยวกับการจัดแต่งทรงผมมากมายในตอนนี้ นี่คือการอัปเดต 2017 jsfiddle.net/rambutan2000/eqbbgb7g
Geordie

@Geordie ฉันดีใจที่ช่วย
Giovan Cruz

2

เพียงแค่เรียกแต่ละส่วนของหีบเพลงว่าหีบเพลงของตัวเอง ใช้งานอยู่: n จะเป็น 0 สำหรับอันแรก (จึงจะแสดง) และ 1, 2, 3, 4 ฯลฯ สำหรับส่วนที่เหลือ เนื่องจากแต่ละชิ้นเป็นหีบเพลงของตัวเองพวกเขาทั้งหมดจะมีเพียง 1 ส่วนและส่วนที่เหลือจะถูกยุบเพื่อเริ่มต้น

$('.accordian').each(function(n, el) {
  $(el).accordion({
    heightStyle: 'content',
    collapsible: true,
    active: n
  });
});

โปรดทราบว่าสิ่งนี้ได้รับการแนะนำแล้วในคำตอบของ 2upmedia ด้านล่าง
Boaz

2

ยิ่งง่ายกว่านั้นให้ติดป้ายกำกับไว้ในแอตทริบิวต์คลาสของแท็ก li แต่ละแท็กและมี jquery เพื่อวนผ่านแต่ละ li เพื่อเริ่มต้นหีบเพลง


1

หากไม่มีหีบเพลง jQuery-UI คุณสามารถทำได้:

<div class="section">
  <div class="section-title">
    Section 1
  </div>
  <div class="section-content">
    Section 1 Content: Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.
  </div>
</div>

<div class="section">
  <div class="section-title">
    Section 2
  </div>
  <div class="section-content">
    Section 2 Content: Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.
  </div>
</div>

และ js

$( ".section-title" ).click(function() {
    $(this).parent().find( ".section-content" ).slideToggle();
});

https://jsfiddle.net/gayan_dasanayake/6ogxL7nm/


0

เปิด jquery-ui - *. js

หา $.widget( "ui.accordion", {

หา_eventHandler: function( event ) {ข้างใน

เปลี่ยนแปลง

var options = this.options,             active = this.active,           clicked = $( event.currentTarget ),             clickedIsActive = clicked[ 0 ] === active[ 0 ],             collapsing = clickedIsActive && options.collapsible,            toShow = collapsing ? $() : clicked.next(),             toHide = active.next(),             eventData = {
                oldHeader: active,
                oldPanel: toHide,
                newHeader: collapsing ? $() : clicked,
                newPanel: toShow            };

ถึง

var options = this.options,
    clicked = $( event.currentTarget),
    clickedIsActive = clicked.next().attr('aria-expanded') == 'true',
    collapsing = clickedIsActive && options.collapsible;

    if (clickedIsActive == true) {
        var toShow = $();
        var toHide = clicked.next();
    } else {
        var toShow = clicked.next();
        var toHide = $();

    }
    eventData = {
        oldHeader: $(),
        oldPanel: toHide,
        newHeader: clicked,
        newPanel: toShow
    };

ก่อน active.removeClass( "ui-accordion-header-active ui-state-active" );

เพิ่มif (typeof(active) !== 'undefined') {และปิด}

สนุก


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.