У меня есть простой оператор if как таковой:
if ($('html').hasClass('m320')) {
// do stuff
}
Это работает, как ожидалось. Однако я хочу добавить больше классов, чтобы if statement
проверить, присутствует ли какой-либо из классов в <html>
теге. Мне нужно, чтобы не все, а просто наличие хотя бы одного класса, а может быть и больше.
Мой вариант использования состоит в том, что у меня есть классы (например m320
, m768
), добавленные для различной ширины окна просмотра, поэтому я хочу выполнить определенный JQuery только в том случае, если это определенная ширина (класс).
Вот что я пробовал до сих пор:
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
}
Однако, похоже, ничего из этого не работает. Не уверен, что делаю неправильно, но, скорее всего, мой синтаксис или структура.
javascript
jquery
syntax
logic
Дэнни Энгландер
источник
источник
Ответы:
Во второй попытке у вас только что были неправильные скобки.
var $html = $("html"); if ($html.hasClass('m320') || $html.hasClass('m768')) { // do stuff }
источник
$('html')
переменную вместо того, чтобы искать ее несколько раз.Вы можете использовать
is()
вместоhasClass()
:if ($('html').is('.m320, .m768')) { ... }
источник
hasClass()
, вероятно, быстрее, но вis()
большинстве случаев намного удобнееis()
иhasClass()
Ради интереса я написал небольшой дополнительный метод jQuery, который будет проверять одно из нескольких имен классов:
$.fn.hasAnyClass = function() { for (var i = 0; i < arguments.length; i++) { if (this.hasClass(arguments[i])) { return true; } } return false; }
Затем в вашем примере вы можете использовать это:
if ($('html').hasAnyClass('m320', 'm768')) { // do stuff }
Вы можете передать сколько угодно имен классов.
Вот расширенная версия, которая также позволяет передавать несколько имен классов, разделенных пробелом:
$.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 }
Рабочая демонстрация: http://jsfiddle.net/jfriend00/uvtSA/
источник
Это может быть другое решение:
if ($('html').attr('class').match(/m320|m768/)) { // do stuff }
согласно jsperf.com, это тоже довольно быстро.
источник
Для тех, кто интересуется некоторыми различными аспектами производительности со всеми этими различными параметрами, я создал здесь пример jsperf: jsperf
Короче говоря, используя
element.hasClass('class')
- самое быстрое.Следующий лучший вариант - использовать
elem.hasClass('classA') || elem.hasClass('classB')
. Примечание по этому поводу: порядок имеет значение! Если более вероятно, что будет найден класс classA, сначала укажите его! Операторы условия ИЛИ возвращаются, как только выполняется одно из них.Наихудшей производительностью было использование
element.is('.class')
.В jsperf также перечислены функция CyberMonk и решение Коли .
источник
Вот небольшой вариант ответа, предложенного 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; }
Позволяет использовать тот же синтаксис, что и .addClass () и .removeClass (). например,
.hasAnyClass('m320 m768')
нуждается в противопульной защите, конечно, поскольку это предполагает хотя бы один аргумент.источник
var classes = $('html')[0].className; if (classes.indexOf('m320') != -1 || classes.indexOf('m768') != -1) { //do something }
источник
Метод hasClass принимает в качестве аргумента массив имен классов, вы можете сделать что-то вроде этого:
$(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(); });
источник
Это на тот случай, если вам нужны оба класса. Для логики или или просто используйте ||
$('el').hasClass('first-class') || $('el').hasClass('second-class')
Не стесняйтесь оптимизировать по мере необходимости
источник
Попробуй это:
if ($('html').hasClass('class1 class2')) { // do stuff }
источник