2016-11-04 29 views
2

からクラスを追加または削除:私は次のようなマークアップを持っているのdiv

<div class="accordion is-open"> 
    <h3 class="accordion-header"> 
     HADER 
     <span class="accordion-indicator"></span> 
    </h3> 
    <div class="accordion-content"></div> 
</div> 

<div class="accordion is-open"> 
    <h3 class="accordion-header"> 
     HADER 
     <span class="accordion-indicator"></span> 
    </h3> 
    <div class="accordion-content"></div> 
</div> 

<div class="accordion"> 
    <h3 class="accordion-header"> 
     HADER 
     <span class="accordion-indicator"></span> 
    </h3> 
    <div class="accordion-content"></div> 
</div> 

私がやろうとしていますどのようなときに、クラス.accordiondivにクラス.is-openedを追加または削除するためにjqueryのを使用することですクラス.accordion-header

私の問題は、すでにdivsの一部にクラス.is-openedが含まれていて、いくつかのクラスが含まれていないことです。クリックして開くことができる必要があります(クラスを追加する.is-opened)その特定のdivがクリックされただけです。ここで

は私のjQuery次のとおりです。

function accordionOpener(obj) { 
    var accordionHeader = obj.find('.accordion-header'); 
    var accordionBody = obj.find('.accordion'); 
    accordionHeader.on('click',function(){ 
     $(accordionBody).toggleClass('is-open'); 
    }); 
} 
new accordionOpener($(this)); 

私は10の賛否歳だかのように私に話すのjQuery、JavaScriptで大きなプロではありませんよ。

+0

マークアップに関連するイベントはありません。どのようにaccordionOpenerを呼び出しますか?あなたは試してみましたか?$( '。accordion')。on( 'click'、function(){new accordionOpener($(this));}); – DinoMyte

+0

私はこの$(accordionBody).toggleClass( 'is-open')と思った。それはすべてのアコーディオンを開くか、それをすべて閉じるようにしています – AlexB

答えて

3

ロジックが正しくありません。これを修正するには、Clickイベントハンドラを直接.accordion-headerクラスにアタッチします。ここからDOMトラバーサルを使用して、関連する.accordion要素を見つけてクラスを切り替えることができます。あなたは、単純な使用jQueryのUIのアコーディオンのプラグインができ

$(function() { 
 
    $('.accordion-header').click(function() { 
 
    $(this).closest('.accordion').toggleClass('is-open'); 
 
    }); 
 
});
.is-open { color: #C00; } /* this is only to see the class being added/removed */
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="accordion is-open"> 
 
    <h3 class="accordion-header"> 
 
     HADER 
 
     <span class="accordion-indicator"></span> 
 
    </h3> 
 
    <div class="accordion-content"></div> 
 
</div> 
 

 
<div class="accordion is-open"> 
 
    <h3 class="accordion-header"> 
 
     HADER 
 
     <span class="accordion-indicator"></span> 
 
    </h3> 
 
    <div class="accordion-content"></div> 
 
</div> 
 

 
<div class="accordion"> 
 
    <h3 class="accordion-header"> 
 
     HADER 
 
     <span class="accordion-indicator"></span> 
 
    </h3> 
 
    <div class="accordion-content"></div> 
 
</div>

+0

OPが他の開かれたdivを閉じたいと思っています。確かにありません –

3

https://jqueryui.com/accordion/ 単にdiv内のすべての要素をラップし、h3タグに広告の見出しを変更し、これを試してみてください。 次のようなプラグインを起動します。

$('.accordion').accordion(); 

このプラグインはまた、キーボードアクセスおよび他のいくつかのアクセシビリティ機能を提供します。

+0

はい、常にプラグインを使ってメソッドをビルドします。たくさんのカスタムコード.. –

+0

OPがコードの3行しか必要としない場合でも、jQueryUIを完全にインクルードするのは無駄です。 –

+0

@RoryMcCrossanはい、いいえ。あなたは本当に正しいですjQuery UIは、より多くを証明した。しかし、良いアクセシブルなモジュールを作成しようとするならば、クラスを適用してビューを切り替えるだけではなく、もう少し作業をしなければなりません。また、jQuery UIライブラリ全体の代わりに必要なコードだけを含むモジュールバンドラを使用することもできます。 – marcobiedermann

0

ここでは、開いたアコーディオンでのみ維持する方法があります。あなたが.showクラスを指定し、他のすべてのパネルを非表示にする必要があるCSSで

$('.accordion').click(function(){ 
    $('.accordion').removeClass('is-open'); 
    $('.show').removeClass('show'); 
    $(this).addClass('is-open'); 
    $('.accordion-content', this).addClass('show') 
}) 

。私はまた、ちょうどそれの地獄のためのカーソルを追加しました。 :)

.accordion { 
    cursor: pointer; 
} 

.accordion-content { 
    display:none; 
} 

.show { 
    display: initial; 
} 
関連する問題