2016-08-01 6 views
2

클릭하지 않고 클릭 한 클래스의 클래스를 변경하고 싶습니다.방금 ​​클릭하지 않고 클릭하지 않은 클래스를 어떻게 변경합니까?

내가 원하지 않는 것을 :

$('#buttonid').addClass('active')

내가 클릭되는 버튼의 맥락을 잡아 자동 버튼을 클릭 한에 관계없이, 그것에 클래스를 추가하고 싶습니다.

이상적으로 나는 각 버튼에 할당하는 onClick 함수가 있고 그 함수가있는 버튼에 대해서만 클래스를 변경하고 싶습니다. 같은

뭔가 :

의사 코드

onClick function() { 
    thisButton.addClass('active') 
} 
+0

가장 쉬운 방법은 함수를 시작하는 모든 버튼에 클래스를 추가하는 것이 아닙니다. 그렇지 않으면 html 태그'onclick = ""'을 사용할 수 있습니다. 다음은 그 예입니다 : http://www.w3schools.com/jsref/event_onclick.asp. 또 다른 방법은 버튼 ('$ ("button"). on ("click", function() {});}에서 클릭을 듣고 주어진 클래스 나 id가 미리 정의 된 목록에 있는지 확인하는 것입니다. – user3528269

+0

'onClick' 코드를 추가 할 수 있다면 코드에 의해 영향을받는 여러 개의 버튼을 식별 할 수있는'class'를 추가 할 수 있습니까? – haxxxton

+0

현재의 셋업에서, 나는 React를 사용하고 있는데, 이것은 onClick을 사용하도록 장려하고 있습니다.하지만 React가 없어도 전에 건너 왔던 문제입니다. 클래스에 대한 아이디어는 작동하지만 여전히 함수 나 onClick 하나보다 변경하기가 어려운 불필요한 단계를 추가하는 것처럼 보입니다. 특히 수백 개의 가능한 버튼으로 작업하는 경우 더욱 그렇습니다. –

답변

1

당신은 버튼을 포함하는 요소에 이벤트 리스너를 추가 할 수 있습니다. 핸들러 함수는 이벤트를 트리거 한 요소를 가리키는 target 적절성을 포함하는 click 이벤트를 수신합니다. e.target과 비교하여 필요한 요소가 있는지 확인할 수 있습니다. 스 니펫은 IE9 +입니다, 이전 버전의 브라우저에 대한 polyfills이 있습니다 :

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

 
container.addEventListener('click', function(e) { 
 
    var target = e.target; 
 
    if (target.dataset.action == 'click') { 
 
    target.classList.toggle('clicked'); 
 
    } 
 
})
button.clicked { 
 
    background-color: gold; 
 
}
<div id="container"> 
 
    <button data-action="click">Click Me</button> 
 
    <button data-action="click">Click Me</button> 
 
    <button data-action="click">Click Me</button> 
 
    <button>Nothing Will Happen</button> 
 
    <button data-action="click">Click Me</button> 
 
    <button data-action="click">Click Me</button> 
 
</div>

주 (난 내 코드에서 dataset를 사용).

+0

나는 그것을 좋아합니다. 그게 내가 찾고있는 행동의 목표를 조작 할 수 있습니다. 그러나 부모 컨테이너에 여전히 고유 한 ID가 있어야한다는 점이 마음에 들지 않습니다. 내 경우에는 컨테이너의 수를 가변적으로하고 컨테이너가 변경 될 때마다 루프를 실행하고 이벤트 목록을 추가/제거하려는 생각 eners가 더러워 보입니다. –

+0

@CalebAnthony이 경우 모든 클릭 이벤트를 캡처하는 본문 요소에 상위 컨테이너를 설정할 수 있으며 e.target을 사용하여 작업을 결정할 수 있습니다. 한 번만 이벤트 리스너를 설정하면됩니다. –

+0

전체 본문 컨테이너의 모든 클릭 동작에 이벤트 수신기를 설정할 때 단점이 있습니까? –

1

DOM 변경 사항을 확인해야합니다. 이 간단한 예제 MutationObserver() 객체를 사용

(참고 : 나는 '특정'버튼을 당신이 의미 한 것을 알 수 없습니다.)

var body = document.getElementsByTagName('body')[0]; 
var buttons = []; 




/** 
* When a button is clicked 
*/ 
function buttonClickEvent() { 
    this.className = this.className === 'active' ? '' : 'active'; 
} 



/** 
* Iterate each button in the 'buttons' {Array}. 
    * if callback returns false, the loop breaks. 
*/ 
function filterButtons(callback) { 
    for (var i = 0, btn; (btn = buttons[i++]) && (callback(btn) !== false);); 
} 



/** 
* Update buttons in certain collections. 
* @param {HTMLCollection, else ...} addedNodes 
* @param {HTMLCollection, else ...} removedNodes 
* @param {Boolean} ignoreBtnCheck 
*/ 
function updateButtons(addedNodes, removedNodes, ignoreBtnCheck) { 
    for (var i = 0, el; el = addedNodes[i++];) { 
     if (ignoreBtnCheck || el.tagName.toUpperCase() === 'BUTTON') { 
      var found = false; 

      filterButtons(function(btn) { 
       if (btn === el) { 
        found = true; 
        return false; 
       } 
      }); 

      if (!found) { 
       el.addEventListener('click', buttonClickEvent); 
       buttons.push(el); 
      } 
     } 
    } 

    for (i = 0; el = removedNodes[i++];) { 
     if (el.tagName.toUpperCase() === 'BUTTON') { 
      filterButtons(function(btn) { 
       if (btn === el) { 
        buttons.splice(i, 1); 
        return false; 
       } 
      }); 
     } 
    } 

} 




/** 
* Create a 'MutationObserver' to handle 
events like DOMInsertedNode, etc. 
*/ 
var observer = new MutationObserver(function(mutations, observer) { 
    if (mutations[0].addedNodes.length || mutations[0].removedNodes.length) 
     updateButtons(mutations[0].addedNodes, mutations[0].removedNodes); 
}); 




/** 
* Observe DOM changes in 'body'. 
*/ 
observer.observe(body, { childList: true, subtree: true }); 




/** 
* Update at least once each button in 'body' 
*/ 
updateButtons(body.getElementsByTagName('button'), [], true); 
0

당신은 for..of 루프를 사용할 수 document.querySelectorAll()Element.addEventListenerevent.target 현재 참조하는 클릭 요소

.selected { 
 
    color: green; 
 
}
<button>click</button> 
 
<button>click</button> 
 
<button>click</button> 
 
<button>click</button> 
 
<script> 
 
    for (let button of document.querySelectorAll("button")) { 
 
    button.addEventListener("click", e => e.target.classList.add("selected")) 
 
    } 
 
</script>

관련 문제