Как вы делаете jQuerys hasClass
с простым JavaScript? Например,
<body class="foo thatClass bar">
Какой способ JavaScript спросить, есть ли у <body>
этот thatClass
?
Как вы делаете jQuerys hasClass
с простым JavaScript? Например,
<body class="foo thatClass bar">
Какой способ JavaScript спросить, есть ли у <body>
этот thatClass
?
Вы можете проверить, соответствует ли element.className
/\bthatClass\b/
. \b
соответствует разрыву слова.
Или вы можете использовать собственную реализацию jQuery:
var className = " " + selector + " ";
if ( (" " + element.className + " ").replace(/[\n\t]/g, " ").indexOf(" thatClass ") > -1 )
Чтобы ответить на ваш более общий вопрос, вы можете посмотреть jQuery исходный код на github или в источнике для hasClass
специально для этого источника просмотра.
Просто используйте classList.contains()
:
if (document.body.classList.contains('thatClass')) {
// do some stuff
}
Другое использование classList
:
document.body.classList.add('thisClass');
// $('body').addClass('thisClass');
document.body.classList.remove('thatClass');
// $('body').removeClass('thatClass');
document.body.classList.toggle('anotherClass');
// $('body').toggleClass('anotherClass');
Поддержка браузера:
Самый эффективный один вкладыш, который
thisClass
для элемента с class="thisClass-suffix"
.function hasClass( target, className ) {
return new RegExp('(\\s|^)' + className + '(\\s|$)').test(target.className);
}
// 1. Use if for see that classes:
if (document.querySelector(".section-name").classList.contains("section-filter")) {
alert("Grid section");
// code...
}
<!--2. Add a class in the .html:-->
<div class="section-name section-filter">...</div>
Атрибут, который хранит используемые классы, className
.
Итак, вы можете сказать:
if (document.body.className.match(/\bmyclass\b/)) {
....
}
Если вы хотите, чтобы местоположение показывало вам, как jQuery делает все, я бы предложил:
Я использую простое/минимальное решение, одну строку, кросс-браузер, а также работает с устаревшими браузерами:
/\bmyClass/.test(document.body.className) // notice the \b command for whole word 'myClass'
Этот метод хорош тем, что не требует полифилов, и если вы используете их для classList
он намного лучше с точки зрения производительности. По крайней мере для меня.
Обновление: я сделал крошечный полифилл, который теперь является универсальным решением:
function hasClass(element,testClass){
if ('classList' in element) { return element.classList.contains(testClass);
} else { return new Regexp(testClass).exec(element.className); } // this is better
//} else { return el.className.indexOf(testClass) != -1; } // this is faster but requires indexOf() polyfill
return false;
}
Для других манипуляций с классами, смотрите полный файл здесь.
hasClass:
HTMLElement.prototype.hasClass = function(cls) {
var i;
var classes = this.className.split(" ");
for(i = 0; i < classes.length; i++) {
if(classes[i] == cls) {
return true;
}
}
return false;
};
Функция addClass:
HTMLElement.prototype.addClass = function(add) {
if (!this.hasClass(add)){
this.className = (this.className + " " + add).trim();
}
};
removeClass:
HTMLElement.prototype.removeClass = function(remove) {
var newClassName = "";
var i;
var classes = this.className.replace(/\s{2,}/g, ' ').split(" ");
for(i = 0; i < classes.length; i++) {
if(classes[i] !== remove) {
newClassName += classes[i] + " ";
}
}
this.className = newClassName.trim();
};
хорошим решением для этого является работа с classList и содержащий.
я сделал это так:
... for ( var i = 0; i < container.length; i++ ) {
if ( container[i].classList.contains('half_width') ) { ...
Итак, вам нужен ваш элемент и проверьте список классов. Если один из классов совпадает с тем, который вы ищете, он вернет true, если не вернет false!
Используйте что-то вроде:
Array.prototype.indexOf.call(myHTMLSelector.classList, 'the-class');
if (document.body.className.split(/\s+/).indexOf("thatClass") !== -1) {
// has "thatClass"
}
Ну, все вышеперечисленные ответы довольно хороши, но вот небольшая простая функция, которую я взбивал. Это работает очень хорошо.
function hasClass(el, cn){
var classes = el.classList;
for(var j = 0; j < classes.length; j++){
if(classes[j] == cn){
return true;
}
}
}
Эта функция hasClass работает в IE8 +, FireFox и Chrome:
hasClass = function(el, cls) {
var regexp = new RegExp('(\\s|^)' + cls + '(\\s|$)'),
target = (typeof el.className === 'undefined') ? window.event.srcElement : el;
return target.className.match(regexp);
}
Что вы думаете об этом подходе?
<body class="thatClass anotherClass"> </body>
var bodyClasses = document.querySelector('body').className;
var myClass = new RegExp("thatClass");
var trueOrFalse = myClass.test( bodyClasses );