Используя простой JavaScript (не jQuery), есть ли способ проверить, содержит ли элемент класс?
В настоящее время я делаю это:
var test = document.getElementById("test");
var testClass = test.className;
switch (testClass) {
case "class1":
test.innerHTML = "I have class1";
break;
case "class2":
test.innerHTML = "I have class2";
break;
case "class3":
test.innerHTML = "I have class3";
break;
case "class4":
test.innerHTML = "I have class4";
break;
default:
test.innerHTML = "";
}
<div id="test" class="class1"></div>
Проблема в том, что если я изменю HTML на этот ...
<div id="test" class="class1 class5"></div>
... точного соответствия больше нет, поэтому я получаю вывод по умолчанию none ( ""
). Но я все равно хочу выход быть , I have class1
потому что <div>
все еще содержит в .class1
класс.
javascript
html
css
dom
daGUY
источник
источник
Ответы:
Используйте метод:
element.classList
.contains
Это работает во всех современных браузерах, и есть полифилы для поддержки старых браузеров.
В качестве альтернативы , если вы работаете с более старыми браузерами и не хотите использовать полифиллы для их исправления, использование
indexOf
корректно, но вам нужно немного его настроить:В противном случае вы также получите,
true
если класс, который вы ищете, является частью другого имени класса.DEMO
jQuery использует аналогичный (если не тот же) метод.
Применительно к примеру:
Так как это не работает вместе с оператором switch, вы можете добиться того же эффекта с помощью этого кода:
Это также менее избыточно;)
источник
div
есть два класса, но он будет выводиться толькоI have class1
при использованииbreak
. Если вы хотите вывести каждый класс, который имеет элемент, то вы можете просто взятьclassName
и разделить его на пробелы. Или какова ваша настоящая цель?Простое и эффективное решение - метод .contains .
источник
contains
метод вelement.classList
недвижимостиВ современных браузерах вы можете просто использовать
contains
методElement.classList
:демонстрация
Поддерживаемые браузеры
(от CanIUse.com )
Polyfill
Если вы хотите использовать,
Element.classList
но также хотите поддерживать старые браузеры, рассмотрите возможность использования этого полифилла от Eli Grey .источник
Поскольку он хочет использовать switch (), я удивлен, что никто еще не высказал это:
источник
Element.matches ()
element.matches (selectorString)
Согласно MDN Web Docs :
Следовательно, вы можете использовать,
Element.matches()
чтобы определить, содержит ли элемент класс.Просмотр совместимости браузера
источник
Вот небольшой фрагмент кода. Если вы пытаетесь проверить, содержит ли элемент класс, без использования jQuery.
Это объясняет тот факт, что элемент может содержать несколько имен классов, разделенных пробелом.
ИЛИ
Вы также можете назначить эту функцию прототипу элемента.
И вызвать его так (очень похоже на
.hasClass()
функцию jQuery ):источник
Упрощенный oneliner: 1
1
indexOf
для массивов не поддерживается IE (конечно). Для этого есть множество обезьяньих заплат.источник
-
, рассматриваются как границы слова. Например, ищетfoo
и классfoo-bar
даетtrue
.Это немного старый, но, возможно, кто-то найдет мое решение полезным:
источник
className
это просто строка, поэтому вы можете использовать обычную функцию indexOf, чтобы увидеть, содержит ли список классов другую строку.источник
class
в приведенном выше примере?foo
в элементе, который имеетfoobar
класс.Я знаю там много ответов, но большинство из них для дополнительных функций и дополнительных классов. Это тот, который я лично использую; намного чище и намного меньше строк кода!
источник
<body class="category-page">
иdocument.body.className.match('page')
- будет совпадать, ноpage
к элементу не прикреплен класс\b
, например/\bpage\b/g
, так как это регулярное выражение (примечание: нужно использовать/ /g
).Вот не зависящее от регистра тривиальное решение:
источник
Если элемент имеет только одно имя класса, вы можете быстро проверить его, получив атрибут класса. Другие ответы гораздо более надежны, но это, безусловно, имеет свои варианты использования.
источник
Я создал метод-прототип, который использует
classList
, если возможно, еще прибегает кindexOf
:Тестовая страница
источник
Уловка Феликса, заключающаяся в добавлении пробелов по сторонам className и искомой строки, является правильным подходом к определению, имеет ли элемент класс или нет.
Чтобы иметь различное поведение в зависимости от класса, вы можете использовать ссылки на функции или функции в карте:
источник
Я бы заполнил Поли функциональностью classList и использовал бы новый синтаксис. Таким образом, более новый браузер будет использовать новую реализацию (что намного быстрее), и только старые браузеры получат снижение производительности из кода.
https://github.com/remy/polyfills/blob/master/classList.js
источник
Это немного не так, но если у вас есть событие, которое вызывает переключение, вы можете обойтись без классов:
Ты можешь сделать
.replace(/[0-9]/g, '')
удаляет цифры изid
.Это немного странно, но работает для длинных переключателей без дополнительных функций или петель
источник
Посмотрите эту ссылку Codepen для более быстрого и простого способа проверки элемента, если у него есть определенный класс, использующий ванильный JavaScript ~!
hasClass (Vanilla JS)
источник
Это поддерживается в IE8 +.
Сначала мы проверяем,
classList
существует ли он, мы можем использоватьcontains
метод, который поддерживается IE10 +. Если мы находимся на IE9 или 8, то возвращаемся к использованию регулярного выражения, которое не так эффективно, но является кратким полифилом.В качестве альтернативы, если вы компилируете с babel, вы можете просто использовать:
el.classList.contains(className);
источник
Попробуй это:
источник
foo-bar
и поискfoo
.a-zA-Z0-9_
] как символы слова. Так что для имен классов, содержащих символ минус, это не сработает .Я думаю, что идеальным решением будет это
источник
в каком элементе в настоящее время находится класс .bar? Вот еще одно решение, но оно зависит от вас.
jsfiddle demo
Конечно, это всего лишь поиск 1 простого элемента
<img>
(/Image/g
), но вы можете поместить все в массив, как<li>
is/LI/g
,<ul>
=/UL/g
и т. Д.источник
Просто чтобы добавить к ответу людей, пытающихся найти имена классов внутри встроенных элементов SVG.
Измените
hasCLass()
функцию на:Вместо использования
className
свойства вам нужно использоватьgetAttribute()
метод, чтобы получить имя класса.источник
Я создал эти функции для своего сайта, я использую только vanilla javascript, возможно, это кому-нибудь поможет. Сначала я создал функцию для получения любого элемента HTML:
Затем функция, получающая класс для удаления и селектор элемента:
Теперь вы можете использовать это так:
Надеюсь, это поможет.
источник
Совет: старайтесь как можно больше удалять зависимости jQuery в своих проектах - VanillaJS .
document.firstElementChild
возвращается<html>
тег, затемclassList
атрибут возвращает все добавленные к нему классы.источник
Для меня самый элегантный и быстрый способ добиться этого:
источник