Hasta ahora tengo que hacer esto:
elem.classList.add("first");
elem.classList.add("second");
elem.classList.add("third");
Si bien esto es factible en jQuery, así
$(elem).addClass("first second third");
Me gustaría saber si hay alguna forma nativa de agregar o eliminar.
javascript
html
Tienda Enrique Moreno
fuente
fuente
El nuevo operador de propagación hace que sea aún más fácil aplicar múltiples clases CSS como matriz:
fuente
DOMTokenList
lugar de una matriz? Sé que DOMTokenList es un objeto tipo matriz. Entonces, ¿es posible usarlo con elclassList.add()
método o debe DOMTokenList convertirse en una matriz real?La
classList
propiedad garantiza que las clases duplicadas no se agreguen innecesariamente al elemento. Con el fin de mantener esta funcionalidad, si no le gustan las versiones longhand o la versión de jQuery, me gustaría sugerir la adición de unaaddMany
función yremoveMany
queDOMTokenList
(el tipo declassList
):Estos serían utilizables así:
Actualizar
Según sus comentarios, si solo desea escribir un método personalizado para estos en caso de que no estén definidos, intente lo siguiente:
fuente
Dado que el
add()
método declassList
just permite pasar argumentos separados y no una sola matriz, debe invocaradd()
usando apply. Para el primer argumento, deberá pasar laclassList
referencia desde el mismo nodo DOM y, como segundo argumento, la matriz de clases que desea agregar:fuente
Para agregar clase a un elemento
Eliminar una clase
fuente
className
. Es terrible para el rendimiento (incluso recuperar su valor provoca un reflujo).Las versiones más nuevas de la especificación DOMTokenList permiten múltiples argumentos para
add()
yremove()
, así como un segundo argumentotoggle()
para forzar el estado.Al momento de escribir, Chrome admite múltiples argumentos para
add()
yremove()
, pero ninguno de los otros navegadores lo hace. IE 10 y versiones inferiores, Firefox 23 y versiones inferiores, Chrome 23 y versiones inferiores y otros navegadores no admiten el segundo argumentotoggle()
.Escribí el siguiente pequeño polyfill para ayudarme hasta que el soporte se expanda:
Se
DOMTokenList
espera un navegador moderno con cumplimiento de ES5 , pero estoy usando este polyfill en varios entornos específicamente dirigidos, por lo que funciona muy bien para mí, pero podría necesitar ajustes para los scripts que se ejecutarán en entornos de navegador heredados como IE 8 y versiones anteriores .fuente
Puedes hacer lo siguiente
Añadir
Eliminar
Referencia
TLDR;
En caso directo, la eliminación anterior debería funcionar. Pero en caso de eliminación, debe asegurarse de que exista la clase antes de eliminarlos
fuente
Aquí hay una solución para usuarios de IE 10 y 11 que parecía bastante sencilla.
O
fuente
La definición estándar solo permite agregar o eliminar una sola clase. Un par de funciones de envoltura pequeñas pueden hacer lo que pides:
Estos contenedores le permiten especificar la lista de clases como argumentos separados, como cadenas con elementos separados por comas o espacios, o una combinación. Para ver un ejemplo, consulte http://jsfiddle.net/jstoolsmith/eCqy7
fuente
Una solución muy simple, no sofisticada, pero funcional que debería creer es un navegador cruzado:
Crea esta función
Llámalo así: removeAddClasses (node.classList, arrayToRemove, arrayToAdd);
... donde arrayToRemove es una matriz de nombres de clase para eliminar: ['myClass1', 'myClass2'] etcétera
... y arrayToAdd es una matriz de nombres de clase para agregar: ['myClass3', 'myClass4'] etcétera
fuente
Suponga que tiene una variedad de clases para agregar, puede usar la sintaxis de propagación ES6:
let classes = ['first', 'second', 'third']; elem.classList.add(...classes);
fuente
Me gustó la respuesta de @ rich.kelly, pero quería usar la misma nomenclatura que
classList.add()
(cadenas separadas por comas), por lo que una ligera desviación.Entonces puedes usar:
Necesito probar todos los navegadores, pero esto funcionó para Chrome.
¿Deberíamos estar buscando algo más específico que la existencia de
DOMTokenList.prototype.addMany
? ¿Qué hace exactamenteclassList.add()
que falle en IE11?fuente
Otro polyfill para
element.classList
está aquí . Lo encontré a través de MDN .Incluyo ese script y lo uso
element.classList.add("first","second","third")
como está previsto.fuente