2017-01-13 16 views
1

私はサブカテゴリとサブカテゴリのリストを持つカテゴリリストのコントロールをしようとしています。同じクラスの要素で発生する1つの関数

<ul class="selectbox-ul"> 
    <li> 
     <div>Category</div> 
     <ul class="selectbox-ul-child"> 
      <li> 
       <div>Subcategory</div> 
       <ul class="selectbox-ul-child"> 
        <li> 
         <div>Sub-subcategory</div> 
        </li> 
       </ul> 
       <span id="trigger">icon</span> 
      </li> 
     </ul> 
     <span id="trigger">icon</span> 
    </li> 
    .... 
</ul> 

だから私のショットul.selectbox-UL-子供のためのクラスを追加しました:

var trigger = document.getElementById("trigger"); 

function subCatStatus() { 
    if(this.parentElement.children[1].className != "... expanded") { 
     this.parentElement.children[1].className += " expanded" 
    } else { 
     this.parentElement.children[1].className == "..." 
    }; 
}; 

trigger.addEventListener("click", subCatStatus); 

そして、それは最初スパン#トリガーに対してのみ機能(

はここHTMLですサブカテゴリを表示する)、次のサブカテゴリは何もしません(私はまた、.getElementsByClassNameを使用しようとしましたが、トリガーのいずれにも機能しませんでした)。だから私はいくつかの説明をしたいのですが、なぜこれは動作しません。そしてそれを働かせる方法についてのアドバイス。

+5

IDは一意であると想定されるため、1つの '#trigger 'しか持たないようにしてください。 – Musa

+2

同じIDを持つ要素を多数持つべきではありません。クラス名などの別のセレクタを使用して、一致する要素を繰り返しイベントリスナーを追加する必要があります –

+2

**なぜ同じIDを持つ2つの要素が悪いのですか?無効なHTML以外は[** getElementById **](https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementById)は、HtmlCollectionではなく、単一の要素を返します。つまり、渡された最初の要素が返されます。 – Nope

答えて

1

すでに述べたように、document.getElementById()は複数の値を返さないため、同じIDを持つ複数の要素をスタックすることはできません。

あなたはそれだけであなたの最初で動作しますので、次のコードにのみ単一の要素を返しますgetElementByIdを

var triggers = document.getElementsByClassName("trigger"); 

function subCatStatus() { 
    if(this.parentElement.children[1].className != "... expanded") { 
     this.parentElement.children[1].className += " expanded" 
    } else { 
     this.parentElement.children[1].className == "..." 
    }; 
}; 

for(var i = 0; i < triggers.length; i++) { 
    triggers[i].addEventListener("click", subCatStatus); 
} 
1

JavaScriptを代わりにIDのこれらのスパンのそれぞれに「トリガー」クラスを割り当て、試してみるの代わりにしようとするかもしれIDを持つ要素が見つかりました。

getElementsByClassNameは、同じクラスの検出された要素の配列を返します。したがって、要素のイベントにリスナーを追加する場合、この配列をループして個々に追加する必要があります。

関連する問題