2011-06-17 11 views
6

En mi HTML, tengo una div así:¿Cómo aplicar una matriz de clases a classList.contains?

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

En mi JavaScript, tengo una serie de clases que me interesa:

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

En los buenos navegadores, que pueda utilizar la característica impresionante classList para probar si o no mi div tiene las clases apropiadas:

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

Esto está bien, pero lo que realmente me gusta hacer es algo como esto (la sintaxis es tonto, pero esta es la idea general):

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

¿Hay alguna manera de hacer esto? Si de todos modos tengo que recorrer mi matriz de clases, classList se vuelve mucho menos genial.

+0

habría que considerar jQuery? – js1568

+2

No funcionará como podría pensar. 'classList.contains' solo considera el primer parámetro de todos modos. Todos los demás son ignorados. 'div.classList.contains (goodClasses [0], goodClasses [1]);' does ** not ** work. Ver: http://jsfiddle.net/fkling/VcrnD/1/. ** Debes ** iterar. –

Respuesta

11

Como @Felix Kling señala correctamente, classList.contains acepta solo un argumento.

Si sus navegadores compatibles apoyan el método every() en Array, usted puede hacer esto:

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

Los navegadores que no admiten que puede utilizar the MDC compatibility fix:

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 Buena forma ... –

+0

classList ni siquiera es una matriz. – Robert

+1

@Robert: No dije que era. Si echas un vistazo a la pregunta, 'goodClasses' * es * una Matriz, y OP quería aplicar directamente esa Matriz como los argumentos a' contiene() 'usando' .apply() '. Eso no funciona porque 'contains()' solo acepta un argumento. Así que la solución que di fue usar '.every()' en la Matriz, y hacer que la devolución de llamada a '.every()' pruebe cada ítem en la Matriz, y devolver el resultado final de 'true' si cada nombre de clase en el Array pasó la prueba '.contains()', o 'false' si uno o más no lo hicieron. – user113716

Cuestiones relacionadas