추가하기 전에 클래스가 이미 할당되었는지 확인하십시오.


113

jQuery에서 해당 클래스를 추가하기 전에 클래스가 이미 요소에 할당되었는지 확인하는 것이 좋습니다. 전혀 효과가 없을까요?

예를 들면 :

<label class='foo'>bar</label>

클래스 baz가 이미에 할당되었는지 확실하지 않은 경우 label이것이 가장 좋은 방법일까요?

var class = 'baz';
if (!$('label').hasClass(class)) {
  $('label').addClass(class);
}

아니면 이것으로 충분할까요?

$('label').addClass('baz');

12
.hasClass클래스가 있는지 확인해야 할 때만 사용 하고 클래스를 할당해야 할 때만 사용했습니다 .addClass. jQuery를이 클래스를 복제하지 않습니다
Samich

7
테스트없이 클래스를 추가하기 만하면됩니다. 이미 존재하는 경우 다시 추가되지 않습니다.
Blazemonger 2011-09-13

답변:


177

전화 만하세요 addClass(). jQuery가 검사를 수행합니다. 직접 확인하면 jQuery가 여전히 확인을 실행 하므로 작업이 두 배로 늘어납니다 .


47

콘솔에서 간단하게 확인 addClass하면 동일한 클래스로 여러 번 호출 하는 것이 안전하다는 것을 알 수 있습니다.

특히 소스 에서 수표를 찾을 수 있습니다.

if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
  setClass += classNames[ c ] + " ";
}

2
내 질문을 다시 읽어 보시기 바랍니다 당신은 자사하지 beeing는 대한 안전하지만 가장 좋은 방법에 대해 알
Muleskinner

7
편집 한 대답에서 나는, 클래스 allready에 추가하기 전에 지정된 경우 jQuery를 실제로 확인하는 것이 볼이 체크 자신 / 감사 할 나쁜 관행 것, 즉
Muleskinner

5
@Muleskinner 그게 내가 의미하는 바입니다.
Raynos 2011 년

41
@Raynos : 콘솔에서 간단한 확인을 통해 동일한 클래스로 addClass를 여러 번 호출하는 것이 안전하다는 것을 알 수 있습니다. 그래도이 질문은 제가 Google에서 답변을 구했을 때 가장 인기있는 질문 중 하나였습니다. 다른 곳에서 잘 문서화되어있는 사소한 것조차도 Stack Overflow에 포함되어 있습니다.
eirirlar 2013

10
이 답변에는 너무 많은 태도가 있습니다. 약간의 재치로 대답 할 수있었습니다.
dreadwail

4

이 질문은이 질문 의 중복으로 표시된 다른 질문에 이어 내 관심을 끌었습니다 .

이 답변은 약간의 추가 세부 사항과 함께 수락 된 답변을 요약합니다.

불필요한 검사를 피하여 최적화하려고합니다. 이와 관련하여 알아야 할 요소는 다음과 같습니다.

  1. 자바 스크립트를 통해 DOM 요소를 조작하여 클래스 속성에 중복 된 클래스 이름을 가질 수 없습니다. 당신이있는 경우 class="collapse"귀하의 HTML에, 전화는 Element.classList.add("collapse");별도의 추가하지 않습니다 붕괴 클래스를. 기본 구현은 모르지만 충분해야한다고 생각합니다.
  2. JQuery는 그 addClassremoveClass구현 에서 몇 가지 필요한 검사를 수행합니다 (나는 소스 코드를 확인했습니다 ). 의 경우 addClass몇 가지 확인 후 클래스가 존재하면 JQuery가 다시 추가하려고하지 않습니다. 마찬가지로 removeClassJQuery는 cur.replace( " " + clazz + " ", " " );클래스가 존재하는 경우에만 클래스를 제거하는 작업을 수행합니다.

주목할만한 점은 JQuery가 removeClass무의미한 재 렌더링을 피하기 위해 구현에서 일부 최적화를 수행한다는 것입니다. 이렇게 간다

...
// only assign if different to avoid unneeded rendering.
finalValue = value ? jQuery.trim( cur ) : "";
if ( elem.className !== finalValue ) {
    elem.className = finalValue;
}
...

따라서 수행 할 수 있는 최상의 마이크로 최적화는 함수 호출 오버 헤드 및 관련 구현 검사를 피하는 것입니다.

당신은 클래스 이름을 전환하고 싶은 말은 collapse당신이 완전히 클래스가 추가되거나 제거 될 때의 제어에있는 경우, 그리고 경우 collapse클래스가 처음 결석 다음과 같이, 당신은 최적화 할 수 있습니다 :

$(document).on("scroll", (function () {
    // hold state with this field
    var collapsed = false;

    return function () {
        var scrollTop, shouldCollapse;

        scrollTop = $(this).scrollTop();
        shouldCollapse = scrollTop > 50;

        if (shouldCollapse && !collapsed) {
            $("nav .branding").addClass("collapse");
            collapsed = true;

            return;
        }

        if (!shouldCollapse && collapsed) {
            $("nav .branding").removeClass("collapse");
            collapsed = false;
        }
    };
})());

한편, 스크롤 위치의 변경으로 인해 클래스를 토글하는 경우 스크롤 이벤트 처리 를 제한 하는 것이 좋습니다 .


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.