2016-11-09 8 views
0

私はw3cschoolからアコーデオンメニューを作成するための例を取っ​​た。この例は、純粋なjavascriptで書かれています。 jQueryで書き直したいけど動作しません。 これはオリジナルです:jQueryの選択と純粋なjavascript

var acc = document.getElementsByClassName("accordion"); 
var i; 

for (i = 0; i < acc.length; i++) { 
    acc[i].onclick = function() { 
     this.classList.toggle("active"); 
     this.nextElementSibling.classList.toggle("show"); 
    } 
} 

、これはjQueryのでは私のバージョンです:

$(".accordion").each(function (index) { 
    $(this).click(function() { 
     $(this).toggleClass("active"); 
     $(this).next().toggleClass("show"); 
    }); 
}); 

項目が膨張し、選択したが開かれた項目が閉じません。 私のjQueryでどこが間違っていますか?

ありがとうございました!

+0

だけ先端は、そのように変数を宣言することは無意味です。私は個人的に変数をヌルとして定義し、それらを宣言から分離したいものに修正しますが、あなたの場合は '' var acc = document.getElementsById( 'accordion')、i = null; '' 。 – Crowes

+2

@JoshCroweあなたはどこからそのアイデアを得ましたか? 'var i;'は完全に有効で、 'i'を' undefined'に初期化します。 – Boldewyn

+3

@JoshCrowe間違ったヒントをしないでください。 –

答えて

2

他のアコーディオンからクラスを削除する必要があります。

$(".accordion").click(function() {  
    var self = $(this); 

    //get other accordions 
    var otherAccordion = $(".accordion").not(self); 
    //remove classes 
    otherAccordion.removeClass("active"); 
    otherAccordion.next().removeClass("show");  

    //toggle classes 
    self.toggleClass("active"); 
    self.next().toggleClass("show"); 
}); 

そして結合事象

+0

ありがとうございました!なぜ純粋なjavascriptはよりコンパクトですか? – robyg72

+0

なぜ私は.each()メソッドが必要ないのですか? $( "。accordion")のループが見つかったすべての要素にループ? – robyg72

+0

@ robyg72、_each()メソッドは必要ありません?_ jQueryは内部的にそれを行います。 – Satpal

0

ため.each()の必要はありませんそれぞれの必要なし(ループ用

最初の方法

(function() { 
 

 
$(".accordion").click(function (index) { 
 
    $(this).next().slideDown(); 
 
    $(this).siblings(".accordion").next().slideUp(); \t 
 
}); 
 

 
})();
button.accordion { 
 
background-color: #eee; 
 
color: #444; 
 
cursor: pointer; 
 
padding: 18px; 
 
width: 100%; 
 
border: none; 
 
text-align: left; 
 
outline: none; 
 
font-size: 15px; 
 
transition: 0.4s; 
 
} 
 

 
button.accordion.active, button.accordion:hover { 
 
background-color: #ddd; 
 
} 
 

 
div.panel { 
 
padding: 0 18px; 
 
display: none; 
 
background-color: white; 
 
} 
 

 
div.panel.show { 
 
display: block; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<h2>Accordion</h2> 
 

 
<button class="accordion">Section 1</button> 
 
<div class="panel"> 
 
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p> 
 
</div> 
 

 
<button class="accordion">Section 2</button> 
 
<div class="panel"> 
 
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p> 
 
</div> 
 

 
<button class="accordion">Section 3</button> 
 
<div class="panel"> 
 
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p> 
 
</div>

第二の方法は、

$(".accordion").click(function (index) { 
 
if($(this).hasClass("active")) { 
 
$(this).removeClass("active"); 
 
$(this).next().slideUp(); 
 
\t } 
 
\t else { 
 
\t $(this).addClass("active"); 
 
    $(this).next().slideDown(); 
 
\t } 
 
\t $(this).siblings(".accordion").removeClass("active"); 
 
\t $(this).siblings(".accordion").next().slideUp(); \t 
 
});
button.accordion { 
 
background-color: #eee; 
 
color: #444; 
 
cursor: pointer; 
 
padding: 18px; 
 
width: 100%; 
 
border: none; 
 
text-align: left; 
 
outline: none; 
 
font-size: 15px; 
 
transition: 0.4s; 
 
} 
 

 
button.accordion.active, button.accordion:hover { 
 
background-color: #ddd; 
 
} 
 

 
div.panel { 
 
padding: 0 18px; 
 
display: none; 
 
background-color: white; 
 
} 
 

 
div.panel.show { 
 
display: block; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<h2>Accordion</h2> 
 

 
<button class="accordion">Section 1</button> 
 
<div class="panel"> 
 
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p> 
 
</div> 
 

 
<button class="accordion">Section 2</button> 
 
<div class="panel"> 
 
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p> 
 
</div> 
 

 
<button class="accordion">Section 3</button> 
 
<div class="panel"> 
 
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p> 
 
</div>

関連する問題