2016-08-04 3 views
0

다른 버튼을 선택하면 클래스 active이 켜지 며, active 클래스의 버튼이 다시 선택되면 버튼을 토글하는 버튼이 여러 개 있습니다 (예 : 클래스 삭제).JavaScript : querySelectorAll & classList가 예상대로 작동하지 않습니다.

또한 console.log 일 때 this이 선택한 요소를 올바르게 반환합니다.

라인 this.classList.toggle('active');은 클래스를 추가하고 있지만 제거하지는 않습니다. 왜 그런가?

var controls = document.querySelectorAll('.controls > button'); 

    for (var i = 0; i < controls.length; i++) { 
     controls[i].addEventListener('click', btnClick, false); 
    } 

    function btnClick() { 
     [].forEach.call(controls, function(el) { 
      // Remmove active class from all buttons 
      el.classList.remove('active'); 
     }); 

     this.classList.toggle('active'); 
    } 
+0

라디오 버튼을 다시 만들고있는 것 같습니다. – Quentin

+0

나는 네가하는 말을 안다. 그래서 더 나은 접근법은 라디오 버튼을 사용하는 것입니다. 그러나 스타일을 변경하여 레이블이 스타일을 얻고 라디오 버튼 UI를 숨겨야합니다. 이 경우 버튼처럼 보입니다. –

답변

1

편집

는 귀하의 의견에 따르면, 당신은 버튼을 전환 할 수 있어야합니다. 이 동작을 사용하기위한 대답을 업데이트했습니다.

var controls = document.querySelectorAll('.controls > button'); 
 

 
// you can use forEach here too 
 
[].forEach.call(controls, el => { 
 
    el.addEventListener('click', btnClick, false) 
 
}) 
 

 
function btnClick() { 
 
    // use Array function for lexical this 
 
    [].forEach.call(controls, el => { 
 
    // except for the element clicked, remove active class 
 
    if (el !== this) el.classList.remove('active'); 
 
    }); 
 

 
    // toggle active on the clicked button 
 
    this.classList.toggle('active'); 
 
}
button { 
 
    border-width: 1px; 
 
    border-radius: 1rem; 
 
    outline: 0; 
 
} 
 

 
button.active { 
 
    background: dodgerblue; 
 
    color: white; 
 
}
<div class="controls"> 
 
    <button class="active">A</button> 
 
    <button>B</button> 
 
    <button>C</button> 
 
    <button>D</button> 
 
</div>

+0

A를 선택한 다음 A를 다시 선택하면 선택이 해제되지 않습니다. 그게 내 문제 야. –

+0

글쎄, 당신은 항상 'active'를'btnClick'의 마지막 줄로 다시 토글하기 때문입니다. – naomik

+0

A를 선택한 다음 B를 선택하면 A가 꺼져 야합니까? – naomik

1

먼저 모든 요소에서 클래스를 제거합니다. 그런 다음 그 중 하나를 토글합니다. 방금 모든 항목에서 제거 했으므로 항상 다시 추가됩니다.

클래스를 제거 할 목록에서 선택한 것을 제외합니다.

function btnClick() { 

    var target = this; 

    [].forEach.call(controls, function(el) { 
     if (target !== el) { 
      el.classList.remove('active'); 
     } 
    }); 

    target.classList.toggle('active'); 
} 
+0

당신은 정확합니다, 나를 위해 doh! 빠른 답변 주셔서 감사합니다. –

관련 문제