2011-06-17 29 views
6

ClassList.contains için bir dizi sınıf nasıl uygulanır?

<div class="a b c"></div> 

benim JavaScript, ben ilgilendiğim sınıfların bir dizi var:

var goodClasses = ['a', 'c']; 

iyi tarayıcılarda, kullanabileceğim benim HTML'de

, ben gibi bir div var müthiş classList özelliği benim div uygun sınıfları olup olmadığını test etmek için:

return div.classList.contains(goodClasses[0], goodClasses[1]); 

Bu tamam, ama ne gerçekten yapmak istediğim böyle bir şey (sözdizimi saçma, ama bu genel düşünce):

return div.classList.contains.apply(div, goodClasses); 

bunu yapmanın bir yolu var mı? Zaten sınıfların benim diziye döngü varsa, classList bir sürü daha az serin olur.

+0

Eğer JQuery ele alacak: o the MDC compatibility fix kullanabilirsiniz desteklemeyen

return goodClasses.every(function(c) { return div.classList.contains(c); }); 

Tarayıcılar? – js1568

+2

Düşünebileceğiniz gibi çalışmayacak. classList.contains sadece ilk parametreyi dikkate alır. Diğerleri yok sayılır. div.classList.contains (goodClasses [0], goodClasses [1]); '** ** çalışmıyor. Bakınız: http://jsfiddle.net/fkling/VcrnD/1/. ** ** yinelemek zorundasın. –

cevap

11

@Felix Kling doğru olarak işaret ettiğinden, classList.contains yalnızca bir bağımsız değişken kabul eder.

desteklenen tarayıcılar Array üzerinde every() yöntemini destekleyen, bu yapabilirdi:

if (!Array.prototype.every) 
{ 
    Array.prototype.every = function(fun /*, thisp */) 
    { 
    "use strict"; 

    if (this === void 0 || this === null) 
     throw new TypeError(); 

    var t = Object(this); 
    var len = t.length >>> 0; 
    if (typeof fun !== "function") 
     throw new TypeError(); 

    var thisp = arguments[1]; 
    for (var i = 0; i < len; i++) 
    { 
     if (i in t && !fun.call(thisp, t[i], i, t)) 
     return false; 
    } 

    return true; 
    }; 
} 
+1

+1 Güzel bir şekilde .... –

+0

classList bir dizi bile değil. – Robert

+1

@Robert: Olduğunu söylemedim. Soruyu ele alırsanız, 'goodClasses' * * bir Array'dir ve OP, Array öğesini' .apply() 'kullanarak' include() 'argümanı olarak doğrudan uygulamak istemiştir. Bu işe yaramıyor çünkü 'içerir()' tek bir argümanı kabul eder. Bu yüzden verdiğim çözüm, Array'daki '.every()' işlevini kullanmaktı ve '.every()' i her bir öğeyi Dizideki her bir öğeyi sınamak ve her bir sınıf isminin 'true' sonucunu döndürmesidir. Array, .contains() 'testini veya bir ya da daha çoğunun yapmadıysa 'false' komutunu geçti. – user113716

İlgili konular