Tengo una simple declaración if como tal:
if ($('html').hasClass('m320')) {
// do stuff
}
Esto funciona como se esperaba. Sin embargo, quiero agregar más clases para if statement
verificar si alguna de las clases está presente en la <html>
etiqueta. Lo necesito para que no sean todos, sino solo la presencia de al menos una clase, pero puede ser más.
Mi caso de uso es que tengo clases (por ejemplo m320
, m768
) agregadas para varios anchos de ventana, por lo que solo quiero ejecutar cierto Jquery si es un ancho específico (clase).
Esto es lo que he probado hasta ahora:
1.
if ($('html').hasClass('m320', 'm768')) {
// do stuff
}
2.
if ($('html').hasClass('m320')) || ($('html').hasClass('m768')) {
// do stuff
}
3.
if ($('html').hasClass(['m320', 'm768'])) {
// do stuff
}
Sin embargo, ninguno de estos parece funcionar. No estoy seguro de qué estoy haciendo mal, pero lo más probable es que mi sintaxis o estructura.
javascript
jquery
syntax
logic
Danny Englander
fuente
fuente
Respuestas:
Acaba de tener algunos paréntesis desordenados en su segundo intento.
var $html = $("html"); if ($html.hasClass('m320') || $html.hasClass('m768')) { // do stuff }
fuente
$('html')
en caché en una variable en lugar de tener que buscarla varias veces.Podrías usar en
is()
lugar dehasClass()
:if ($('html').is('.m320, .m768')) { ... }
fuente
hasClass()
es probablemente más rápido, perois()
es mucho más conveniente la mayor parte del tiempois()
yhasClass()
Para divertirme, escribí un pequeño método de complemento de jQuery que verificará cualquiera de los múltiples nombres de clase:
$.fn.hasAnyClass = function() { for (var i = 0; i < arguments.length; i++) { if (this.hasClass(arguments[i])) { return true; } } return false; }
Luego, en su ejemplo, podría usar esto:
if ($('html').hasAnyClass('m320', 'm768')) { // do stuff }
Puede pasar tantos nombres de clases como desee.
Aquí hay una versión mejorada que también le permite pasar varios nombres de clases separados por un espacio:
$.fn.hasAnyClass = function() { for (var i = 0; i < arguments.length; i++) { var classes = arguments[i].split(" "); for (var j = 0; j < classes.length; j++) { if (this.hasClass(classes[j])) { return true; } } } return false; } if ($('html').hasAnyClass('m320 m768')) { // do stuff }
Demostración de trabajo: http://jsfiddle.net/jfriend00/uvtSA/
fuente
Esta puede ser otra solución:
if ($('html').attr('class').match(/m320|m768/)) { // do stuff }
según jsperf.com, también es bastante rápido.
fuente
Para cualquiera que se pregunte acerca de algunos de los diferentes aspectos de rendimiento con todas estas opciones diferentes, he creado un caso de jsperf aquí: jsperf
En resumen, usando
element.hasClass('class')
es lo más rápido.La siguiente mejor apuesta es usar
elem.hasClass('classA') || elem.hasClass('classB')
. Una nota sobre este: ¡el orden importa! Si es más probable que se encuentre la clase 'classA', ¡indíquela primero! Las declaraciones de condición OR regresan tan pronto como se cumple una de ellas.El peor rendimiento con diferencia fue el uso
element.is('.class')
.También se enumeran en jsperf la función de CyberMonk y la solución de Kolja .
fuente
Aquí hay una ligera variación en la respuesta ofrecida por jfriend00:
$.fn.hasAnyClass = function() { var classes = arguments[0].split(" "); for (var i = 0; i < classes.length; i++) { if (this.hasClass(classes[i])) { return true; } } return false; }
Permite el uso de la misma sintaxis que .addClass () y .removeClass (). Por ejemplo,
.hasAnyClass('m320 m768')
necesita prueba de balas, por supuesto, ya que asume al menos un argumento.fuente
var classes = $('html')[0].className; if (classes.indexOf('m320') != -1 || classes.indexOf('m768') != -1) { //do something }
fuente
El método hasClass aceptará una matriz de nombres de clase como argumento, puede hacer algo como esto:
$(document).ready(function() { function filterFilesList() { var rows = $('.file-row'); var checked = $("#filterControls :checkbox:checked"); if (checked.length) { var criteriaCollection = []; checked.each(function() { criteriaCollection.push($(this).val()); }); rows.each(function() { var row = $(this); var rowMatch = row.hasClass(criteriaCollection); if (rowMatch) { row.show(); } else { row.hide(200); } }); } else { rows.each(function() { $(this).show(); }); } } $("#filterControls :checkbox").click(filterFilesList); filterFilesList(); });
fuente
Esto es en caso de que necesite ambas clases presentes. Para cualquiera o la lógica, simplemente use ||
$('el').hasClass('first-class') || $('el').hasClass('second-class')
Siéntase libre de optimizar según sea necesario
fuente
Prueba esto:
if ($('html').hasClass('class1 class2')) { // do stuff }
fuente