Bir öğenin sınıfını JavaScript ile nasıl değiştirebilirim?


2775

onclickJavaScript kullanan bir etkinliğe yanıt olarak bir HTML öğesinin sınıfını nasıl değiştirebilirim ?


28
"Class özelliği çoğunlukla stil sayfasındaki bir sınıfa işaret etmek için kullanılır. Ancak, bir JavaScript tarafından (HTML DOM aracılığıyla) belirtilen bir sınıfa sahip HTML öğelerinde değişiklik yapmak için de kullanılabilir." - w3schools.com/tags/att_standard_class.asp
Triynko

11
element.setAttribute(name, value); Değiştir nameile class. Değiştir valueEğer tırnak içine sınıfı verdik ne olursa olsun adı ile. Bu, geçerli sınıfı silmeyi ve farklı bir sınıf eklemeyi önler. Bu jsFiddle örneği tam çalışma kodunu gösterir.
Alan Wells

3
OnClick ile bir HTML öğesi sınıfını değiştirmek için şu kodu kullanın: <input type='button' onclick='addNewClass(this)' value='Create' /> ve javascript bölümünde: function addNewClass(elem){ elem.className="newClass";} Çevrimiçi
Iman Bahrampour

@Triynko - w3schools'daki bu bağlantı değişti, Eylül 2012'de olduğu gibi. İşte Archive.org'daki sayfa 12 / Eyl / 2012: HTML sınıfı Attribute-w3schools . W3schools.com adresindeki değiştirme sayfasının bağlantısı: HTML sınıfı Attribute-w3schools .
Kevin Fegan

Yanıtlar:


3881

Sınıfları değiştirmek için modern HTML5 Teknikleri

Modern tarayıcılar, bir kütüphaneye ihtiyaç duymadan sınıfları değiştirmeyi kolaylaştıran yöntemler sağlayan classList ekledi:

document.getElementById("MyElement").classList.add('MyClass');

document.getElementById("MyElement").classList.remove('MyClass');

if ( document.getElementById("MyElement").classList.contains('MyClass') )

document.getElementById("MyElement").classList.toggle('MyClass');

Ne yazık ki, bunlar v10'dan önce Internet Explorer'da çalışmaz, ancak bu sayfadan kullanılabilen IE8 ve IE9'a destek eklemek için bir şim vardır . Yine de giderek daha fazla destekleniyor .

Basit çapraz tarayıcı çözümü

Bir öğeyi seçmenin standart JavaScript yolu document.getElementById("Id"), aşağıdaki örneklerin kullandığı yöntemdir - elbette öğeleri başka yollarla elde edebilirsiniz ve doğru durumda thisbunun yerine basitçe kullanabilirsiniz - ancak, bununla ilgili ayrıntılara girmek kapsamın ötesindedir. cevap.

Bir öğenin tüm sınıflarını değiştirmek için:

Varolan tüm sınıfları bir veya daha fazla yeni sınıfla değiştirmek için className özniteliğini ayarlayın:

document.getElementById("MyElement").className = "MyClass";

(Birden çok sınıf uygulamak için boşlukla ayrılmış bir liste kullanabilirsiniz.)

Bir öğeye ek sınıf eklemek için:

Bir öğeye, varolan değerleri kaldırmadan / etkilemeden bir sınıf eklemek için bir boşluk ve yeni sınıf adı ekleyin, örneğin:

document.getElementById("MyElement").className += " MyClass";

Bir öğeyi bir öğeden kaldırmak için:

Bir öğeye tek bir sınıfı, diğer potansiyel sınıfları etkilemeden kaldırmak için, basit bir normal ifade değişikliği gerekir:

document.getElementById("MyElement").className =
   document.getElementById("MyElement").className.replace
      ( /(?:^|\s)MyClass(?!\S)/g , '' )
/* Code wrapped for readability - above is all one statement */

Bu normal ifadenin açıklaması aşağıdaki gibidir:

(?:^|\s) # Match the start of the string, or any single whitespace character

MyClass  # The literal text for the classname to remove

(?!\S)   # Negative lookahead to verify the above is the whole classname
         # Ensures there is no non-space character following
         # (i.e. must be end of string or a space)

gBayrak gerekli durumlarda sınıf adı eklendi birden çok kez olarak tekrarına yerini söyler.

Bir öğenin zaten bir öğeye uygulanıp uygulanmadığını kontrol etmek için:

Bir sınıfı kaldırmak için yukarıda kullanılan aynı regex, belirli bir sınıfın var olup olmadığına dair bir kontrol olarak da kullanılabilir:

if ( document.getElementById("MyElement").className.match(/(?:^|\s)MyClass(?!\S)/) )


Bu eylemleri onclick olaylarına atama:

JavaScript'i doğrudan HTML olay özniteliklerinin (örneğin onclick="this.className+=' MyClass'") içine yazmak mümkün olsa da, bu önerilen davranış değildir. Özellikle daha büyük uygulamalarda, HTML işaretlemesini JavaScript etkileşim mantığından ayırarak daha sürdürülebilir kod elde edilir.

Bunu başarmanın ilk adımı bir işlev oluşturmak ve işlevi onclick özniteliğinde çağırmaktır, örneğin:

<script type="text/javascript">
    function changeClass(){
        // Code examples from above
    }
</script>
...
<button onclick="changeClass()">My Button</button>

(Bu kodun komut dosyası etiketlerinde olması gerekmez, bu sadece örnek olması içindir ve JavaScript'i farklı bir dosyaya eklemek daha uygun olabilir.)

İkinci adım onclick olayını HTML'den JavaScript'e taşımak, örneğin addEventListener kullanarak

<script type="text/javascript">
    function changeClass(){
        // Code examples from above
    }

    window.onload = function(){
        document.getElementById("MyElement").addEventListener( 'click', changeClass);
    }
</script>
...
<button id="MyElement">My Button</button>

(Window.onload kısmının, HTML'nin yüklenmesi bittikten sonra bu işlevin içeriğinin yürütülmesi için gerekli olduğunu unutmayın - bu olmadan JavaScript kodu çağrıldığında MyElement olmayabilir, bu nedenle satır başarısız olur.)


JavaScript Çerçeveleri ve Kütüphaneleri

Yukarıdaki kodun tamamı standart JavaScript'tedir, ancak ortak görevleri basitleştirmek için bir çerçeve veya kitaplık kullanmak ve kodunuzu yazarken aklınıza gelmeyebilecek sabit hatalardan ve uç durumlardan yararlanmak yaygın bir uygulamadır.

Bazı insanlar, bir sınıfı değiştirmek için ~ 50 KB'lik bir çerçeve eklemenin aşırı olduğunu düşünürken, önemli miktarda JavaScript çalışması veya olağandışı çapraz tarayıcı davranışına sahip olabilecek herhangi bir şey yapıyorsanız, düşünmeye değer.

(Çok kabaca bir kütüphane, belirli bir görev için tasarlanmış bir araç setidir, ancak bir çerçeve genellikle birden çok kütüphane içerir ve tam bir görev kümesi gerçekleştirir.)

Yukarıdaki örnekler , muhtemelen en yaygın kullanılan JavaScript kitaplığı olan jQuery kullanılarak yeniden oluşturulmuştur (yine de araştırmaya değer başkaları da vardır).

( $Burada jQuery nesnesi olduğunu unutmayın .)

JQuery ile Sınıfları Değiştirme:

$('#MyElement').addClass('MyClass');

$('#MyElement').removeClass('MyClass');

if ( $('#MyElement').hasClass('MyClass') )

Buna ek olarak, jQuery geçerli değilse bir sınıf eklemek veya aşağıdakileri yapan bir sınıfı kaldırmak için bir kısayol sağlar.

$('#MyElement').toggleClass('MyClass');


JQuery ile bir click olayına bir işlev atama:

$('#MyElement').click(changeClass);

veya bir kimliğe ihtiyaç duymadan:

$(':button:contains(My Button)').click(changeClass);



105
Harika cevap Peter. Bir soru ... neden JQuery ile Javascript'ten daha iyi ? JQuery harika, ama tüm yapmanız gereken buysa - birkaç JavaScript satırı yerine tüm JQuery libray'ı da dahil etmek ne haklı çıkar?
mattstuehler

23
@mattstuehler 1) "daha iyi henüz x" ifadesi genellikle "daha iyi daha iyi (yapabilirsiniz) x" anlamına gelir. 2) Konunun kalbine ulaşmak için jQuery, DOM'a erişmeye / manipüle etmeye yardımcı olmak için tasarlanmıştır ve çoğu zaman bu tür bir şeyi her yerde yapmanız gerektiğinde yapmanız gerekir.
Barry

31
Bu çözümle ilgili bir hata: Düğmenizi birkaç kez tıkladığınızda, öğenin zaten var olup olmadığını kontrol etmek yerine öğeye "MyClass" Sınıfını birkaç kez ekleyecektir. Böylece şöyle bir HTML sınıfı özniteliği ile sonuçlanabilir:class="button MyClass MyClass MyClass"
Web_Designer

35
Bir sınıfı 'myClass'ı kaldırmaya çalışıyorsanız ve bir sınıfı' önek-myClass 'sınıfınız varsa, bir sınıfı kaldırmak için yukarıda verdiğiniz normal ifade sınıfınızda' önek- 'bırakacaktırAd: O
jinglesthula

16
Vay be, üç yıl 183 upvotes ve şimdiye kadar kimse bunu fark etmedi. Teşekkürler jinglesthula, regex'i düzelttim, böylece sınıf adlarının parçalarını yanlış kaldırmayacağım. // Sanırım bu neden bir Çerçeve'nin (jQuery gibi) kullanılmaya değer olduğuna iyi bir örnektir - bunun gibi hatalar daha erken yakalanır ve sabitlenir ve normal kodda değişiklik yapılmasını gerektirmez.
Peter Boughton

422

Ayrıca şunları da yapabilirsiniz:

document.getElementById('id').classList.add('class');
document.getElementById('id').classList.remove('class');

Ve bir sınıfı değiştirmek için (varsa eklemek için kaldırın):

document.getElementById('id').classList.toggle('class');

63
Bunun HTML5 bağımlı olduğuna inanıyorum.
John

12
Eli Grey'in classListşimasına ihtiyacınız olacak .
ELLIOTTCABLE

15
Mozilla Developer Network , 10'dan az Internet Explorer'da doğal olarak çalışmadığını belirtiyor. Testimde ifadenin doğru olduğunu düşünüyorum. Görünüşe göre Eli Gray şim Internet Explorer 8-9 için gereklidir. Ne yazık ki, kendi sitesinde (arama ile bile) bulamadım. Şim Mozilla bağlantısında mevcuttur.
doubleJ


4
atow "classList" IE10 + 'da kısmi desteğe sahiptir; Opera Mini için destek yok; kalan standart tarayıcılarda tam destek: caniuse.com/#search=classlist
Nick Humphrey

119

JQuery kullanmayan eski projelerimden birinde, öğenin sınıfı olup olmadığını eklemek, kaldırmak ve denetlemek için aşağıdaki işlevleri oluşturdum:

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

Yani, örneğin, onclickdüğmeye bir sınıf eklemek istiyorsanız bunu kullanabilirsiniz:

<script type="text/javascript">
    function changeClass(btn, cls) {
        if(!hasClass(btn, cls)) {
            addClass(btn, cls);
        }
    }
</script>
...
<button onclick="changeClass(this, "someClass")">My Button</button>

Şimdiye kadar jQuery kullanmak daha iyi olurdu.


8
Bu, istemciniz jQuery kullanmanıza izin vermediğinde harika olur. (Çünkü neredeyse kendi kütüphaneni inşa ediyorsun.)
Mike

1
@Mike İstemci jQuery kullanmanıza izin vermezse, yalnızca kendi kitaplığınızda gereken özellikleri yeniden oluşturup yeniden oluşturmaz mıydınız?
kfrncs

5
@kfrncs Çünkü genellikle bu kadar geniş bir çerçeveye ihtiyacım yok. Düşündüğüm proje için, ihtiyacım olan tek işlev 3 sınıf adı (var, ekle, kaldır) ve çerez (var, ekle, kaldır) işlevleriydi. Diğer her şey özel veya yerel olarak iyi destekleniyordu. Böylece, her şey birlikte, yorumlar da dahil olmak üzere küçültmeden önce sadece 150 satırdı.
Mike

2
Dostum, 04:00 ve çok teşekkür ederim. Vanilla JS, projemde kullandığımız şey ve bu bir hayat kurtarıcıydı.
LessQuesar

Bu benim en sevdiğim çözüm. Her yerde kullanıyorum. Projenizin halihazırda bunu yapmanın başka bir yolu olmadığında sınıf ekleme ve çıkarma işleminin en zarif yolu olduğuna inanıyorum.
WebWanderer

77

Şöyle kullanabilirsiniz node.className:

document.getElementById('foo').className = 'bar';

Bu IE5.5 ve uygun kadar çalışmalıdır PPK .


11
bu, nesnenin üzerindeki tüm diğer sınıfların üzerine yazacaktır ... bu yüzden bu kadar basit değil.
Eric Sebasta

51

Vay canına, burada çok fazla cevap var.

<div class="firstClass" onclick="this.className='secondClass'">

14
Mütevazi javascript örnek kod yazmak için korkunç bir uygulama olduğunu söyleyebilirim ...
Gabe

22
Kabul etmem, çünkü örnek kodun iyi bir örnek olması gerektiğini düşünüyorum.
thomasrutter

1
İyi bir örnek hayal gücünü aynı anda yönlendirmeli ve ateşlemelidir. Düşüncenin yerini almamalı, ilham almalı.
Anthony Rutledge

4
Diğer cevaplar aşırı değil, mevcut sınıfları da öğe üzerinde tutuyor.
gcampbell

47

Saf JavaScript kodu kullanma:

function hasClass(ele, cls) {
    return ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
}

function addClass(ele, cls) {
    if (!this.hasClass(ele, cls)) ele.className += " " + cls;
}

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

function replaceClass(ele, oldClass, newClass){
    if(hasClass(ele, oldClass)){
        removeClass(ele, oldClass);
        addClass(ele, newClass);
    }
    return;
}

function toggleClass(ele, cls1, cls2){
    if(hasClass(ele, cls1)){
        replaceClass(ele, cls1, cls2);
    }else if(hasClass(ele, cls2)){
        replaceClass(ele, cls2, cls1);
    }else{
        addClass(ele, cls1);
    }
}

33

Bu benim için çalışıyor:

function setCSS(eleID) {
    var currTabElem = document.getElementById(eleID);

    currTabElem.setAttribute("class", "some_class_name");
    currTabElem.setAttribute("className", "some_class_name");
}

Mükemmel cevap! Eklemek için soldan sola: Bir grup sınıf öğesi için bir stil belirtmek üzere seçicinin her CSS sınıfı adı için ayarlayın
Roman Polen.

Bu benim için FF üzerinde çalışır, ancak el.className = "newStyle" kullanmaya çalıştığımda; işe yaramadı, neden?
Lukasz 'Severiaan' Grela

1
Kullanabilir el.setAttribute('class', newClass)veya daha iyisini yapabilirsiniz el.className = newClass. Ama değil el.setAttribute('className', newClass).
Oriol

20

Sınıfları ( gist ) eklemek, kaldırmak, değiştirmek ve kontrol etmek için yöntemler eklemek amacıyla HTMLElement nesnesini genişletebilirsiniz :

HTMLElement = typeof(HTMLElement) != 'undefiend' ? HTMLElement : Element;

HTMLElement.prototype.addClass = function(string) {
  if (!(string instanceof Array)) {
    string = string.split(' ');
  }
  for(var i = 0, len = string.length; i < len; ++i) {
    if (string[i] && !new RegExp('(\\s+|^)' + string[i] + '(\\s+|$)').test(this.className)) {
      this.className = this.className.trim() + ' ' + string[i];
    }
  }
}

HTMLElement.prototype.removeClass = function(string) {
  if (!(string instanceof Array)) {
    string = string.split(' ');
  }
  for(var i = 0, len = string.length; i < len; ++i) {
    this.className = this.className.replace(new RegExp('(\\s+|^)' + string[i] + '(\\s+|$)'), ' ').trim();
  }
}

HTMLElement.prototype.toggleClass = function(string) {
  if (string) {
    if (new RegExp('(\\s+|^)' + string + '(\\s+|$)').test(this.className)) {
      this.className = this.className.replace(new RegExp('(\\s+|^)' + string + '(\\s+|$)'), ' ').trim();
    } else {
      this.className = this.className.trim() + ' ' + string;
    }
  }
}

HTMLElement.prototype.hasClass = function(string) {
  return string && new RegExp('(\\s+|^)' + string + '(\\s+|$)').test(this.className);
}

Ve sonra sadece böyle kullanın (tıklandığında sınıf ekler veya kaldırır):

document.getElementById('yourElementId').onclick = function() {
  this.toggleClass('active');
}

İşte demo .


1
Bu biraz ayrıntılı ... İşte çok özlü bir çözüm ... jsfiddle.net/jdniki/UaT3P
zero_cool

5
Üzgünüm @Jackson_Sandland ama jQuery'i hiç kullanmayan noktayı tamamen kaçırdınız.
moka

17

Başka bir popüler çerçeve olan Google Closures'tan bilgi eklemek için dom / classes sınıflarına bakın :

goog.dom.classes.add(element, var_args)

goog.dom.classes.addRemove(element, classesToRemove, classesToAdd)

goog.dom.classes.remove(element, var_args)

Öğeyi seçmek için bir seçenek , bir CSS3 seçiciyle goog.dom.query kullanmaktır :

var myElement = goog.dom.query("#MyElement")[0];

14

Önceki ifadelerde birkaç küçük not ve ince ayar:

Sınıf listesinin birden fazla sınıf adına sahip olması durumunda, bunu global olarak yapmak isteyeceksiniz. Ayrıca, muhtemelen sınıf listesinin uçlarındaki boşlukları sıyırmak ve birden fazla boşluğu boşluk alanlarından kaçınmak için bir boşluğa dönüştürmek isteyeceksiniz. Sınıf adlarıyla dink yapan tek kod aşağıdaki regex kullanıyorsa ve eklemeden önce bir adı kaldırıyorsa, bunların hiçbiri sorun olmamalıdır. Fakat. Kim, kim sınıf adı listesiyle dinliyor olabilir kim bilir.

Bu normal ifade büyük / küçük harfe duyarsızdır, böylece sınıf adlarındaki hatalar, kod sınıf adlarındaki büyük / küçük harfleri önemsemeyen bir tarayıcıda kullanılmadan önce görünebilir.

var s = "testing   one   four  one  two";
var cls = "one";
var rg          = new RegExp("(^|\\s+)" + cls + "(\\s+|$)", 'ig');
alert("[" + s.replace(rg, ' ') + "]");
var cls = "test";
var rg          = new RegExp("(^|\\s+)" + cls + "(\\s+|$)", 'ig');
alert("[" + s.replace(rg, ' ') + "]");
var cls = "testing";
var rg          = new RegExp("(^|\\s+)" + cls + "(\\s+|$)", 'ig');
alert("[" + s.replace(rg, ' ') + "]");
var cls = "tWo";
var rg          = new RegExp("(^|\\s+)" + cls + "(\\s+|$)", 'ig');
alert("[" + s.replace(rg, ' ') + "]");

13

ASP.NET'te bir öğenin CSS sınıfını JavaScript ile değiştirme :

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not Page.IsPostBack Then
        lbSave.Attributes.Add("onmouseover", "this.className = 'LinkButtonStyle1'")
        lbSave.Attributes.Add("onmouseout", "this.className = 'LinkButtonStyle'")
        lbCancel.Attributes.Add("onmouseover", "this.className = 'LinkButtonStyle1'")
        lbCancel.Attributes.Add("onmouseout", "this.className = 'LinkButtonStyle'")
    End If
End Sub

13

Ben jQuery kullanmak ve böyle bir şey yazmak:

jQuery(function($) {
    $("#some-element").click(function() {
        $(this).toggleClass("clicked");
    });
});

Bu kod id unsuru olduğunda bir işlev çağrılacak ekleyen bir-öğe tıklanır. İşlev , henüz bir parçası değilse öğenin sınıf özniteliğine tıklatılır ve varsa orada kaldırır.

Evet, bu kodu kullanmak için sayfanızdaki jQuery kütüphanesine bir referans eklemeniz gerekiyor, ancak en azından kütüphanedeki çoğu işlevin hemen hemen tüm modern tarayıcılarda çalışacağından emin olabilirsiniz ve uygulamadan size zaman kazandıracak aynısını yapmak için kendi kodunuzu.

Teşekkürler


8
jQueryUzun formunu sadece bir kez yazmanız gerekir . her durumda işlevin içinde kullanılabilir jQuery(function($) { });kılar $.
ThiefMaster

10

Çizgi

document.getElementById("MyElement").className = document.getElementById("MyElement").className.replace(/\bMyClass\b/','')

olmalı:

document.getElementById("MyElement").className = document.getElementById("MyElement").className.replace('/\bMyClass\b/','');

8
Yanlış. RegEx, eğik çizgilerle sınırlandırılmıştır. Tırnak eklemek IE'de başarısız olmasına neden olur ve aslında kaldırmaya çalıştığınız sınıfın dizesini aslında sınıfı kaldırmak yerine döndürür.
Dylan

9

IE6 desteği ile vanilya JavaScript'teki bir öğenin sınıfını değiştirme

attributesIE6 bile eski tarayıcılarla uyumluluğu korumak için düğüm özelliğini kullanmaya çalışabilirsiniz:

function getClassNode(element) {
  for (var i = element.attributes.length; i--;)
    if (element.attributes[i].nodeName === 'class')
      return element.attributes[i];
}

function removeClass(classNode, className) {
  var index, classList = classNode.value.split(' ');
  if ((index = classList.indexOf(className)) > -1) {
    classList.splice(index, 1);
    classNode.value = classList.join(' ');
  }
}

function hasClass(classNode, className) {
  return classNode.value.indexOf(className) > -1;
}

function addClass(classNode, className) {
  if (!hasClass(classNode, className))
    classNode.value += ' ' + className;
}

document.getElementById('message').addEventListener('click', function() {
  var classNode = getClassNode(this);
  var className = hasClass(classNode, 'red') && 'blue' || 'red';

  removeClass(classNode, 'red');
  removeClass(classNode, 'blue');

  addClass(classNode, className);
})
.red {
  color: red;
}
.red:before {
  content: 'I am red! ';
}
.red:after {
  content: ' again';
}
.blue {
  color: blue;
}
.blue:before {
  content: 'I am blue! '
}
<span id="message" class="">Click me</span>


8

İşte benim tam sürüm çalışan benim sürüm:

function addHTMLClass(item, classname) {
    var obj = item
    if (typeof item=="string") {
        obj = document.getElementById(item)
    }
    obj.className += " " + classname
}

function removeHTMLClass(item, classname) {
    var obj = item
    if (typeof item=="string") {
        obj = document.getElementById(item)
    }
    var classes = ""+obj.className
    while (classes.indexOf(classname)>-1) {
        classes = classes.replace (classname, "")
    }
    obj.className = classes
}

Kullanımı:

<tr onmouseover='addHTMLClass(this,"clsSelected")'
onmouseout='removeHTMLClass(this,"clsSelected")' >

4
Sınıfı foobarkaldırmaya çalışırsanız bu dersi kırar foo. Gerçek olay işleyici özniteliklerindeki JS, düzenlenmeden önce kırıldı. 4 yaşındaki kabul edilen cevap çok daha iyi.
Quentin

1
teşekkürler, ben sabit (önek sorunu değil). regexp ile ilgili bir hata var eski kabul edilen cevaptır.
alfred

Kodda hala foobarsorun var. Teste buradan
rosell.dk

8

Bir öğe üzerinde bir sınıfı değiştirmek / eklemek / kaldırmak için bir toggleClass:

// If newState is provided add/remove theClass accordingly, otherwise toggle theClass
function toggleClass(elem, theClass, newState) {
    var matchRegExp = new RegExp('(?:^|\\s)' + theClass + '(?!\\S)', 'g');
    var add=(arguments.length>2 ? newState : (elem.className.match(matchRegExp) == null));

    elem.className=elem.className.replace(matchRegExp, ''); // clear all
    if (add) elem.className += ' ' + theClass;
}

bkz. jsfiddle

dinamik olarak yeni bir sınıf oluşturmak için cevabımı da burada görebilirsiniz


6

Kodumda aşağıdaki vanilya JavaScript işlevlerini kullanıyorum. Normal ifadeler kullanırlar ve normal ifadelerde indexOfözel karakterlerin alıntılanmasını gerektirmezler.

function addClass(el, cn) {
    var c0 = (" " + el.className + " ").replace(/\s+/g, " "),
        c1 = (" " + cn + " ").replace(/\s+/g, " ");
    if (c0.indexOf(c1) < 0) {
        el.className = (c0 + c1).replace(/\s+/g, " ").replace(/^ | $/g, "");
    }
}

function delClass(el, cn) {
    var c0 = (" " + el.className + " ").replace(/\s+/g, " "),
        c1 = (" " + cn + " ").replace(/\s+/g, " ");
    if (c0.indexOf(c1) >= 0) {
        el.className = c0.replace(c1, " ").replace(/\s+/g, " ").replace(/^ | $/g, "");
    }
}

Element.classList'i modern tarayıcılarda da kullanabilirsiniz .


3

SEÇENEKLER.

Kullanabileceğiniz seçeneklerin neler olduğunu ve ne classListyapmak istediğinizi nasıl kullanacağınızı görmenizi sağlayan küçük bir stile karşı classList örnekleri .

style vs. classList

Arasındaki fark styleve classListbirlikte olmasıdır styleEğer elemanın stil özelliklerine ekliyoruz, ancak classListtür elemanın sınıf (es) kontrol ediyor ( add, remove, toggle, contain), ben nasıl kullanılacağını göstereceğim addve removenedeni, söz yöntemi popüler olanlar.


Stil Örneği

Bir margin-topöğeye özellik eklemek istiyorsanız , şunları yapabilirsiniz:

// Get the Element
const el = document.querySelector('#element');

// Add CSS property 
el.style.margintop = "0px"
el.style.margintop = "25px" // This would add a 25px to the top of the element.

classList Örneği

Biz var diyelim <div class="class-a class-b">, bu durumda, biz zaten bizim div öğesi eklendi 2 sınıfları var, class-ave class-b, ve ne sınıfları kontrol etmek isteyen removeve ne sınıf add. Burası classListkullanışlı hale geliyor.

Kaldırmak class-b

// Get the Element
const el = document.querySelector('#element');

// Remove class-b style from the element
el.classList.remove("class-b")

Ekle class-c

// Get the Element
const el = document.querySelector('#element');

// Add class-b style from the element
el.classList.add("class-c")


1

Sadece bunu atacağımı düşündüm:

function inArray(val, ary){
  for(var i=0,l=ary.length; i<l; i++){
    if(ary[i] === val){
      return true;
    }
  }
  return false;
}
function removeClassName(classNameS, fromElement){
  var x = classNameS.split(/\s/), s = fromElement.className.split(/\s/), r = [];
  for(var i=0,l=s.length; i<l; i++){
    if(!iA(s[i], x))r.push(s[i]);
  }
  fromElement.className = r.join(' ');
}
function addClassName(classNameS, toElement){
  var s = toElement.className.split(/\s/);
  s.push(c); toElement.className = s.join(' ');
}

1

sadece myElement.classList="new-class"mevcut diğer sınıfları korumanız gerekmediği sürece, bu durumda classList.add, .removeyöntemleri kullanabilirsiniz .

var doc = document;
var divOne = doc.getElementById("one");
var goButton = doc.getElementById("go");

goButton.addEventListener("click", function() {
  divOne.classList="blue";
});
div{
  min-height:48px;
  min-width:48px;
}
.bordered{
  border: 1px solid black;
}
.green{
  background:green;
}
.blue{
  background: blue;
}
<button id="go">Change Class</button>

<div id="one" class="bordered green">

</div>


1

Tamam, bu durumda jQuery kullanmanız veya saf javascript'te kendi Yöntemlerinizi yazmanız gerektiğini düşünüyorum, benim tercihim başka nedenlerden dolayı ihtiyacım yoksa tüm jQuery uygulamamı enjekte etmek yerine kendi yöntemlerimi eklemektir.

Ben jQuery benzer sınıflar ekleme, sınıflar, vb işlemek için birkaç işlevsellik eklemek için benim javascript çerçevesine yöntemler gibi aşağıdaki gibi bir şey yapmak istiyorum, bu tamamen IE9 + desteklenir, ayrıca benim kod ES6 yazılmış, bu yüzden ihtiyacınız tarayıcınızın desteklediğinden veya babil gibi bir şey kullandığınızdan emin olmak için, aksi takdirde kodunuzda ES5 sözdizimini kullanmanız gerekir, bu şekilde, öğeyi kimlik aracılığıyla buluruz, yani öğenin seçilmesi gereken bir kimliğe sahip olması gerekir:

//simple javascript utils for class management in ES6
var classUtil = {

  addClass: (id, cl) => {
    document.getElementById(id).classList.add(cl);
  },

  removeClass: (id, cl) => {
    document.getElementById(id).classList.remove(cl);
  },

  hasClass: (id, cl) => {
    return document.getElementById(id).classList.contains(cl);
  },

  toggleClass: (id, cl) => {
    document.getElementById(id).classList.toggle(cl);
  }

}

ve bunları aşağıdaki gibi kullanmanız yeterlidir, öğenizin 'id' kimliği ve 'class' sınıfı olduğunu hayal edin, bunları bir dize olarak ilettiğinizden emin olun, util'i aşağıdaki gibi kullanabilirsiniz:

classUtil.addClass('myId', 'myClass');
classUtil.removeClass('myId', 'myClass');
classUtil.hasClass('myId', 'myClass');
classUtil.toggleClass('myId', 'myClass');

1

classList DOM API'sı:

Sınıfları eklemek ve kaldırmak için çok uygun bir yöntem classListDOM API'sidir. Bu API, javascript kullanarak listeyi değiştirmek için belirli bir DOM öğesinin tüm sınıflarını seçmemize izin verir. Örneğin:

const el = document.getElementById("main");
console.log(el.classList);
<div class="content wrapper animated" id="main"></div>

Günlükte, yalnızca elemanın sınıflarını değil, aynı zamanda birçok yardımcı yöntem ve özelliği olan bir nesneyi geri aldığımızı gözlemleyebiliriz. Bu nesne, DOM'da bir dizi boşlukla ayrılmış jetonu (sınıflar gibi) temsil etmek için kullanılan bir arabirim olan DOMTokenList arabiriminden miras alır .

Misal:

const el = document.getElementById('container');


function addClass () {
   el.classList.add('newclass');
}


function replaceClass () {
     el.classList.replace('foo', 'newFoo');
}


function removeClass () {
       el.classList.remove('bar');
}
button{
  margin: 20px;
}

.foo{
  color: red;
}

.newFoo {
  color: blue;
}

.bar{
  background-color:powderblue;
}

.newclass{
  border: 2px solid green;
}
<div class="foo bar" id="container">
  "Sed ut perspiciatis unde omnis 
  iste natus error sit voluptatem accusantium doloremque laudantium, 
  totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et 
  quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam 
  voluptatem quia voluptas 
 </div>
  
<button onclick="addClass()">AddClass</button>
  
<button onclick="replaceClass()">ReplaceClass</button>
  
<button onclick="removeClass()">removeClass</button>
  


1

Evet, bunu yapmanın birçok yolu var. ES6 sözdiziminde kolayca başarabiliriz. Sınıf ekle ve kaldır arasında geçiş yapmak için bu kodu kullanın.

const tabs=document.querySelectorAll('.menu li');

for(let tab of tabs){
  
  tab.onclick=function(){
    
  let activetab=document.querySelectorAll('li.active');
    
  activetab[0].classList.remove('active')
  
    tab.classList.add('active'); 
  }
  
}
body {
    padding:20px;
    font-family:sans-serif;    
}

ul {
    margin:20px 0;
    list-style:none;
}

li {
    background:#dfdfdf;
    padding:10px;
    margin:6px 0;
    cursor:pointer;
}

li.active {
    background:#2794c7;
    font-weight:bold;
    color:#ffffff;
}
<i>Please click an item:</i>

<ul class="menu">
  <li class="active"><span>Three</span></li>
  <li><span>Two</span></li>
  <li><span>One</span></li>
</ul>


1
function classed(el, class_name, add_class) {
  const re = new RegExp("(?:^|\\s)" + class_name + "(?!\\S)", "g");
  if (add_class && !el.className.match(re)) el.className += " " + class_name
  else if (!add_class) el.className = el.className.replace(re, '');
}

burada kabul edilen yanıtı kullanmak, sınıf eklemek ve kaldırmak için basit bir çapraz tarayıcı işlevidir

sınıf ekle:

classed(document.getElementById("denis"), "active", true)

sınıfı kaldır:

classed(document.getElementById("denis"), "active", false)

1

Bir sürü cevap, bir sürü iyi cevap.

TL; DR:

document.getElementById('id').className = 'class'

VEYA

document.getElementById('id').classList.add('class');
document.getElementById('id').classList.remove('class');

Bu kadar.

Ve nedenini gerçekten bilmek ve kendinizi eğitmek istiyorsanız, Peter Boughton'un cevabını okumayı öneririm , mükemmel.

Not:
Bu ( belge veya olay ) ile mümkündür :

  • getElementById()
  • getElementsByClassName()
  • querySelector()
  • querySelectorAll()

1

Bir HTML öğesinin sınıfının adını değiştirmek için javascript'te bir className özelliği vardır . Varolan sınıf değeri, className içinde atadığınız yeni değerle değiştirilir.

<!DOCTYPE html>
<html>
<head>
<title>How to change class of an HTML element in Javascript?</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
</head>
<body>
<h1 align="center"><i class="fa fa-home" id="icon"></i></h1><br />

<center><button id="change-class">Change Class</button></center>

<script>
var change_class=document.getElementById("change-class");
change_class.onclick=function()
{
    var icon=document.getElementById("icon");
    icon.className="fa fa-gear";
}

</script>
</body>
</html>

Kredi - https://jaischool.com/javascript-lang/how-to-change-class-name-of-an-html-element-in-javascript.html


1

OP sorusu bir öğenin sınıfını JavaScript ile nasıl değiştirebilirim?

Modern tarayıcılar bunu bir satır javascript ile yapmanıza izin verir :

document.getElementById('id').classList.replace('span1','span2')

Bu classListözellik, çeşitli yöntemlere sahip bir DOMTokenList sağlar . Add () , remove () veya replace () gibi basit manipülasyonları kullanarak bir öğenin classList öğesinde çalışabilirsiniz . Veya çok sofistike olun ve anahtarlar () , değerler () , girişler () içeren bir nesne veya Harita gibi sınıfları yönetin

Peter Boughton'un cevabı harika ama şimdi on yıldan eski. Tüm modern tarayıcılar artık DOMTokenList'i destekliyor - bkz. Https://caniuse.com/#search=classList ve hatta IE11 bazı DOMTokenList yöntemlerini destekliyor


1

Deneyin

element.className='second'


-2

JavaScript kodu çalışıyor:

<div id="div_add" class="div_add">Add class from Javascript</div>
<div id="div_replace" class="div_replace">Replace class from Javascript</div>
<div id="div_remove" class="div_remove">Remove class from Javascript</div>
<button onClick="div_add_class();">Add class from Javascript</button>
<button onClick="div_replace_class();">Replace class from Javascript</button>
<button onClick="div_remove_class();">Remove class from Javascript</button>
<script type="text/javascript">
    function div_add_class()
    {
        document.getElementById("div_add").className += " div_added";
    }
    function div_replace_class()
    {
        document.getElementById("div_replace").className = "div_replaced";
    }
    function div_remove_class()
    {
        document.getElementById("div_remove").className = "";
    }
</script>

Bu bağlantıdan çalışan bir kod indirebilirsiniz .


1
Bu, birden fazla sınıf içeren öğeleri kıracaktır.
gcampbell

-4

İşte bunu yapmak için basit jQuery kodu.

$(".class1").click(function(argument) {
    $(".parentclass").removeClass("classtoremove");
    setTimeout(function (argument) {
        $(".parentclass").addClass("classtoadd");
    }, 100);
});

Buraya,

  • Class1 bir olayın dinleyicisidir.
  • Üst sınıf, değiştirmek istediğiniz sınıfı barındıran sınıftır
  • Classtoremove, sahip olduğunuz eski sınıftır.
  • Eklenecek sınıf, eklemek istediğiniz yeni sınıftır.
  • 100, sınıfın değiştirildiği zaman aşımı gecikmesidir.

İyi şanslar.

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.