私はいくつかの類似の質問に目を通しましたが、クリックしたものとは異なる要素にクラスを追加および削除する方法をVanilla JSで答える特定の例を見つけることができません。ループの設定と要素の繰り返しに関係していることは知っていますが、正確なプロセスで迷子になりました。
クラス名が_faq-container
_の要素がいくつかあり、それらのいずれかをクリックすると、クラス_faq-display
_がbodyタグに追加されます。私はfor (var i = 0; i < elements.length; i++) { elements[i].classList.remove('hover'); }
のようなループを設定する必要があることを知っていますが、これを動作させるためにコードのどこに正確に記述するかはわかりません。私はいくつかの方法を試しましたが、すべて失敗します。
私の現在のスクリプトは次のとおりです。ここでは、配列の最初の要素をターゲットにするだけですが、_faq-container
_要素のいずれかをクリックして、クラス名を最初の唯一のbodyタグに追加できるようにします:
_document.addEventListener("DOMContentLoaded", function() {
document.getElementsByClassName('faq-container')[0].addEventListener('click', function() {
var faqToggle = document.getElementsByTagName('body')[0];
if (faqToggle.classList.contains('faq-display')) {
faqToggle.classList.remove('faq-display');
// alert("remove faq display!");
} else {
faqToggle.classList.add('faq-display');
// alert("add faq display!");
}
});
});
_
_<div class="faq-container cf" id="faq-container">
<h3 <?=ifxless::element( 'name')?>><?=ifxless::fill($this,'name');?> </h3>
<div class="faq-content">
<div class="h_line"> </div>
<div class="faq-bullets" <?=ifxless::element( 'content')?>>
<?=ifxless::fill($this, 'content');?>
</div>
</div>
</div>
_
document.addEventListener("DOMContentLoaded", function() {
var faqContainers = document.getElementsByClassName('faq-container');
var faqToggle = document.getElementsByTagName('body')[0];
for (var i = 0; i < faqContainers.length; i++) {
faqContainers[i].addEventListener('click', function() {
if (faqToggle.classList.contains('faq-display')) {
faqToggle.classList.remove('faq-display');
// alert("remove faq display!");
} else {
faqToggle.classList.add('faq-display');
// alert("add faq display!");
}
});
}
});
ループする必要があります:
var faqs = document.querySelectorAll('.faq-container');
for (var i=0;i<faqs.length;i++) {
faq[i].addEventListener('click', toggleFaq);
// or faq[i].onclick=toggleFaq;
}
function toggleFaq() {
var faqToggle = document.getElementsByTagName('body')[0];
if (faqToggle.classList.contains('faq-display')) {
faqToggle.classList.remove('faq-display');
// alert("remove faq display!");
} else {
faqToggle.classList.add('faq-display');
// alert("add faq display!");
}
}
[〜#〜] note [〜#〜]:これらのdivが多数ある場合は、親に対して1つのイベントハンドラーを用意し、クリックされたものをテストする方が良いでしょう。また、クロスブラウザー接続イベントハンドラーも提供しました
function addEvent(element, myEvent, fnc) { return ((element.attachEvent) ? element.attachEvent('on' + myEvent, fnc) : element.addEventListener(myEvent, fnc, false)); }
var topContainer = document.getElementById('faqContainerParent');
addEvent(topContainer,'click', function(e) {
var tgt = e.target;
if (tgt && tgt.nodeName === 'DIV') {
if (tgt.classList.contains("faq-container")) {
toggleFaq();
}
}
}