2012-09-13 3 views
1

사용자가 div를 선택하거나 선택 취소 할 수있는 함수를 작성했습니다. 자, 내가하려고했던 것은 이라고 선택하고, 모든 것을 선택 해제하는 기능 이었지만, 내 div의 일부만을 선택 취소합니다. 여기에 코드입니다 :removeClass 함수가 제대로 작동하지 않습니다.

var divs = document.getElementsByClassName('fuori'); 
for(i = 0, j = divs.length; i < j; i++){ 
divs[i].addEventListener('click', function(){ 
    if(!hasClass(this, 'selected')){ 
    this.className = this.className + " selected"; 
} else { 
    removeClass(this, 'selected'); 
} 
}); 
} 

removeClass 기능이

function removeClass(ele,cls) { 
    if (hasClass(ele,cls)) { 
     var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)'); 
     ele.className=ele.className.replace(reg,' '); 
    } 
} 

이다는이 원활 클릭 작품으로 deselectAll

function deselectAll(){ 
    var selected = document.getElementsByClassName('selected'); 
    alert(selected.length); 
    for (i = 0; i < selected.length; i++){ 
     removeClass(selected[i], 'selected'); 
    } 
} 

선택 및 선택 해제,하지만 난 어떤 div의를 선택하고 버튼을 누르 때 모든 div를 선택 취소하지 않고 일부만 선택 취소합니다.

어떻게 해결할 수 있습니까? 왜 작동하지 않습니까?

감사합니다.

+0

jQuery가 없습니까? 그것을 사용할 수 있습니까? – user1477388

+0

나는 바닐라 자바 ​​스크립트를 쓰는 법을 잊지 않고 연습하기를 원하며, 불필요한 기능을 많이로드하고 싶지는 않습니다. –

+0

충분합니다. jQuery는 가벼운 프레임 워크이기 때문에 작업이 훨씬 쉬워진다. 예를 들어'$ ('p'). removeClass ('myClass yourClass')'Ref. http://api.jquery.com/removeClass/ – user1477388

답변

1

한번에 변경이 for 루프 : getElementsByClassName()에서

for (var i = selected.length; --i >= 0; removeClass(selected[i], 'selected')); 

반환 값은 NodeList를하지 배열입니다, 그것은 "라이브"입니다. 즉, 클래스를 제거하여 DOM을 변경하면 목록도 변경됩니다.

뒤로 이동하면 문제를 피할 수 있습니다. 또한이 작업을 수행 할 수 있습니다 : 그런데

while (selected.length) removeClass(selected[0], 'selected'); 

당신이 클래스를 제거하는 데 사용하는 정규식은 간단 할 수있다 : 자바 스크립트 정규 표현식에서

function removeClass(ele,cls) { 
    var reg = new RegExp('\\b' + cls + '\\b', 'g'); 
    ele.className=ele.className.replace(reg,' '); 
} 

, \b 수단 "단어 경계". hasClass()도 호출 할 필요가 없습니다. 클래스 문자열이 없으면 교체가 아무 것도하지 않기 때문입니다.

편집 — 주석에서 하이픈이 삽입 된 클래스 이름 (일반적인 규칙)에는 작동하지 않는다고 지적했습니다. 이 문제를 해결해야한다면 다음과 같이 작동합니다.

function removeClass(ele,cls) { 
    var reg = new RegExp('\\b' + cls.replace(/-/g, '\\b-\\b') + '\\b', 'g'); 
    ele.className=ele.className.replace(reg,' '); 
} 

또는 일부 유사 콘텐츠가 해당됩니다.

+0

왜 거꾸로 돌아가서 나는이 문제를 피할 수 있습니까? 나는이 같은 또 하나의 기능을 가지고 있었는데 앞으로도 ... 도움을 주셔서 감사합니다, vey 많이,하지만 문제가 아니라면 더 깊은 explaination을 좋아할 것입니다. –

+1

"i"가 증가하면 앞으로 건너 뜁니다. 왜? "removeClass()"를 호출 할 때마다 목록이 1 씩 짧아지기 때문에 목록의 다른 모든 요소에서 클래스를 제거하기 만합니다.다시 말해, 위치 0의 요소에서 클래스를 제거한 후에는 더 이상 목록에 없게되고 위치 1에 있었던 요소는 위치 0에있게됩니다. "i"를 1로 증가 시키면, 당신은 그 요소를 건너 뜁니다. – Pointy

+0

정말 감사합니다! –

관련 문제