Eklemeden önce sınıfın zaten atanmış olup olmadığını kontrol edin


113

JQuery'de, o sınıfı eklemeden önce bir sınıfın bir öğeye atanmış olup olmadığını kontrol etmeniz önerilir mi? Herhangi bir etkisi olacak mı?

Örneğin:

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

Şüpheye düştüğünüzde, eğer sınıfa bazzaten atanmışsa label, bu en iyi yaklaşım olur mu:

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

yoksa bu yeterli olur mu:

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

12
.hasClassSadece sınıfın var olup olmadığını kontrol etmem gerektiğinde kullandım, sadece sınıf atamam gerekirse - kullanıyorum .addClass. jQuery sınıfları
çoğaltmıyor

7
Sınıfı test etmeden ekleyin. Zaten varsa, tekrar eklenmeyecektir.
Blazemonger

Yanıtlar:


177

Sadece ara addClass(). jQuery kontrolü sizin için yapacak. Kendi başınıza kontrol ederseniz, işi ikiye katlamış olursunuz, çünkü jQuery kontrolü sizin için yine de yürütecektir.


47

Konsoldaki basit bir kontrol addClass, aynı sınıfla birden çok kez aramanın güvenli olduğunu söylerdi .

Özellikle çeki kaynakta bulabilirsiniz

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

2
Lütfen sorumu tekrar okuyun ve bunun güvenli olmakla değil, en iyi uygulama ile ilgili olduğunu fark edeceksiniz
Muleskinner

7
Düzenlenmiş cevabınızdan jQuery'nin sınıfın eklemeden önce zaten atanıp atanmadığını kontrol ettiğini görüyorum, yani kontrolü kendiniz yapmak kötü bir uygulama olur / teşekkürler
Muleskinner

5
@Muleskinner bunu ima ediyordum.
Raynos

41
@Raynos: Konsoldaki basit bir kontrol, addClass'ı aynı sınıfla birden çok kez çağırmanın güvenli olduğunu söylerdi. Yine de, bu soru bir cevap için Google'da aradığımda en çok beğenilenlerden biriydi ... Başka bir yerde iyi belgelenmiş önemsiz şeylerin bile Stack Overflow'da bir yeri var.
eirirlar

10
Bu cevapta çok fazla tutum var. Biraz incelikle cevap verebilirdi.
dreadwail

4

Bu soru, bunun bir kopyası olarak işaretlenen bir diğerinin ardından dikkatimi çekti .

Bu cevap, kabul edilen cevabı biraz ek ayrıntıyla özetler.

Gereksiz bir kontrolden kaçınarak optimize etmeye çalışıyorsunuz, bu bağlamda bilmeniz gereken faktörler şunlardır:

  1. JavaScript aracılığıyla bir DOM öğesini işleyerek sınıf özniteliğinde yinelenen sınıf adlarına sahip olmak mümkün değildir. Eğer varsa class="collapse"HTML'nize, çağıran Element.classList.add("collapse");ek eklemez çöküşü sınıfı. Altta yatan uygulamayı bilmiyorum, ama sanırım yeterince iyi olmalı.
  2. JQuery, addClassve removeClassuygulamalarında bazı gerekli kontrolleri yapar ( kaynak kodunu kontrol ettim ). Çünkü addClass, bazı kontroller yaptıktan sonra ve bir sınıf varsa JQuery onu tekrar eklemeye çalışmaz. Benzer şekilde removeClassJQuery, cur.replace( " " + clazz + " ", " " );bir sınıfı yalnızca mevcutsa kaldıracak bir şeyler yapar .

Dikkat çekmeye değer, JQuery, removeClassanlamsız bir yeniden işlemeyi önlemek için uygulamasında bazı optimizasyonlar yapar . Bu böyle devam ediyor

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

Bu nedenle, yapabileceğiniz en iyi mikro optimizasyon, işlev çağrısı genel giderlerinden ve ilgili uygulama kontrollerinden kaçınmaktır.

Adlandırılmış bir sınıfı değiştirmek istediğinizi varsayalım collapse, eğer sınıfın ne zaman eklendiğini veya kaldırıldığını tamamen kontrol ediyorsanız ve collapsesınıf başlangıçta yoksa, aşağıdaki şekilde optimize edebilirsiniz:

$(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;
        }
    };
})());

Bir kenara, kaydırma konumundaki değişiklikler nedeniyle bir sınıfta geçiş yapıyorsanız , kaydırma olayı işlemeyi azaltmanız şiddetle önerilir .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.