2017-07-15 5 views
0

次の素晴らしいコードがあります。あなたが見ることができるように、それはボタンクリックでコンテンツのボックスを開閉する(表示/非表示)機能です。JavaScript-Eventは最初の要素だけではありません

これは完全にうまく機能します。しかし、最初のボタン/ボックスにのみ...多くの場合(そして多くの場合)、それは動作しません。それは最初のものでのみ動作します。

私はjQueryを使って、すべてのかなり簡単にこれを行うことが知っている - しかし、ここで私の目標は、jQueryのに依存するようにバニラはJavaScriptを使用していないことです。

それでは、どのように私は多くのボタン/ボックス上で動作するコードを編集する必要があります - すべてのバニラのJavascriptで?

(私はjQueryのをスキップするための学習ピースとしてそれを見てください。)

<button class="openUrls" data-thisButton="openUrls--{ID}" data-target="js-urls--{ID}" data-state="closed"><svg… />Collapse</button> 

<div class="urls js-urls--{ID}" data-state="closed">Content</div> 

<style> 
.urls[data-state='closed'] {display:none} 
.urls[data-state='open'] {display:inherit} 
.openUrls[data-state='open'] svg {transform:rotate(180deg)} // rotates the carret-SVG inside the button-element 
</style> 

<script> 
var button = document.querySelector('.openUrls'); 

var toggleState = function(elem,class1,class2) { 
    var elem = document.querySelector(elem); 
    elem.setAttribute('data-state', elem.getAttribute('data-state') === class1 ? class2 : class1); 
}; 

button.onclick = function(e) { 
    e.preventDefault(); 

    var target = button.getAttribute('data-target'); 
    toggleState('.'+target, 'closed', 'open'); 

    var thisButton = this.getAttribute('data-thisButton'); 
    toggleState('[data-thisButton='+thisButton+']', 'closed', 'open'); 
}; 
</script> 

更新:ライブ・デモhttps://jsfiddle.net/b24ybtjv/3/

+2

私はこれをフォローしていません...あなたは 'querySelectorAll'を試しましたか? https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll –

+2

'document.querySelector()':_ "指定したセレクタに一致する文書内** **最初の要素を返します。セレクタの、またはグループ「_ – Andreas

+0

@GerardoFurtado:。私が使用している場合はい、 'querySelectorAll'の何もまったく起こりません。 'querySelector'では少なくとも最初の要素で動作します。 – albuvee

答えて

1

使用querySelectorAll、ループ

var toggleState = function(elem,class1,class2) { 
 
    var elem = document.querySelector(elem); 
 
    elem.setAttribute('data-state', elem.getAttribute('data-state') === class1 ? class2 : class1); 
 
}; 
 

 
var button = document.querySelectorAll('.openUrls'); 
 

 
button.forEach(function(item, index) { 
 
    item.onclick = function(e) { 
 
    e.preventDefault(); 
 

 
    var target = this.getAttribute('data-target'); 
 
    console.log(target); 
 
    toggleState('.' + target, 'closed', 'open'); 
 

 
    var thisButton = this.getAttribute('data-thisButton'); 
 
    toggleState('[data-thisButton=' + thisButton + ']', 'closed', 'open'); 
 
    } 
 
});
.urls[data-state='closed'] {display:none} 
 
.urls[data-state='open'] {display:inherit} 
 
.openUrls[data-state='open'] svg {transform:rotate(180deg)} // rotates the carret-SVG inside the button-element
<button class="openUrls" data-thisButton="openUrls-1" data-target="js-urls-1" data-state="closed"><svg… />Collapse</button> 
 
<button class="openUrls" data-thisButton="openUrls-2" data-target="js-urls-2" data-state="closed"><svg… />Collapse 2</button> 
 

 
<div class="urls js-urls-1" data-state="closed">Content</div> 
 
<div class="urls js-urls-2" data-state="closed">Content2</div>

+0

私とJavaScriptが:-) ...時々ソリューションはとても簡単で、近隣にはストーリーを愛/ヘイトれる理由はここにあります!ありがとう、@ウィンク! – albuvee

+1

@Andreasは私の悪い癖:笑答えを更新し、あなたは歓迎しているalbuvee – ewwink

関連する問題