Wie macht man jQuery's hasClass
mit einfachem altem JavaScript? Beispielsweise,
<body class="foo thatClass bar">
Wie kann man mit JavaScript fragen, ob dies der Fall <body>
ist thatClass
?
Wie macht man jQuery's hasClass
mit einfachem altem JavaScript? Beispielsweise,
<body class="foo thatClass bar">
Wie kann man mit JavaScript fragen, ob dies der Fall <body>
ist thatClass
?
Antworten:
Sie können überprüfen, ob element.className
Übereinstimmungen vorliegen /\bthatClass\b/
.
\b
entspricht einem Wortumbruch.
Oder Sie können die eigene Implementierung von jQuery verwenden:
var className = " " + selector + " ";
if ( (" " + element.className + " ").replace(/[\n\t]/g, " ").indexOf(" thatClass ") > -1 )
Um Ihre allgemeinere Frage zu beantworten, können Sie sich den Quellcode von jQuery auf github oder die Quelle hasClass
speziell in diesem Quell-Viewer ansehen .
rclass
eigentlich;))
\b
mit "thatClass-anotherClass" übereinstimmen?
/[\t\r\n\f]/g
. Es ist auch gut zu erwähnen, dass /\bclass\b/
Klassennamen mit -
Minuszeichen fehlschlagen können (ansonsten funktioniert es gut). Deshalb ist die Implementierung von jQuery besser und zuverlässiger. Beispiel: /\bbig\b/.test('big-text')
Gibt true anstelle von erwartet false zurück.
Verwenden Sie einfach classList.contains()
:
if (document.body.classList.contains('thatClass')) {
// do some stuff
}
Andere Verwendungen von 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');
Browser-Unterstützung:
.classList
als Zeichenfolge abgerufen werden, erkennt jedoch die moderneren Methoden wie.classList.contains()
Der effektivste Einzeiler, der
thisClass
einem Element gesucht wird , das hat class="thisClass-suffix"
.function hasClass( target, className ) {
return new RegExp('(\\s|^)' + className + '(\\s|$)').test(target.className);
}
Das Attribut, in dem die verwendeten Klassen gespeichert werden, lautet className
.
Sie können also sagen:
if (document.body.className.match(/\bmyclass\b/)) {
....
}
Wenn Sie einen Ort suchen, der Ihnen zeigt, wie jQuery alles macht, würde ich vorschlagen:
match
Attribut ist wieder praktisch! Macht jQuery wirklich etwas mehr als in JavaScript möglich?! Wenn nicht, ist jQuery nur ein unnötiges Gewicht von Kurzschriften.
myclass-something
, ebenso wie der \b
Bindestrich.
// 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>
hasClass-Funktion:
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-Funktion:
HTMLElement.prototype.addClass = function(add) {
if (!this.hasClass(add)){
this.className = (this.className + " " + add).trim();
}
};
removeClass-Funktion:
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();
};
Ich verwende eine einfache / minimale Lösung, eine Zeile, einen Cross-Browser und arbeite auch mit älteren Browsern:
/\bmyClass/.test(document.body.className) // notice the \b command for whole word 'myClass'
Diese Methode ist großartig, da keine Polyfills erforderlich sind und wenn Sie sie verwenden, ist sie classList
in Bezug auf die Leistung viel besser. Zumindest für mich.
Update: Ich habe eine winzige Polyfüllung erstellt, die eine Allround-Lösung ist, die ich jetzt verwende:
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;
}
Informationen zur anderen Klassenmanipulation finden Sie in der vollständigen Datei hier .
notmyClassHere
?
!/myClass/.test(document.body.className)
Beachten Sie auch das !
Symbol.
thisIsmyClassHere
.
Eine gute Lösung hierfür ist die Arbeit mit classList und enthält.
Ich habe es so gemacht:
... for ( var i = 0; i < container.length; i++ ) {
if ( container[i].classList.contains('half_width') ) { ...
Sie benötigen also Ihr Element und überprüfen die Liste der Klassen. Wenn eine der Klassen mit der von Ihnen gesuchten identisch ist, wird true zurückgegeben, wenn nicht, wird false zurückgegeben!
Verwenden Sie etwas wie:
Array.prototype.indexOf.call(myHTMLSelector.classList, 'the-class');
myHTMLSelector.classList.indexOf('the-class')
? Willst du nicht auch >=0
am Ende?
[].indexOf
wenn classList
es eine contains
Methode gibt?
myHTMLSelector.classList.indexOf('the-class')
Gibt den Fehler zurück, dass myHTMLSelector.classList.indexOf is not a function
da myHTMLSelector.classList
kein Array ist. Aber ich denke, wenn man es mit Array.prototype
einer Konvertierung aufruft, passiert es. Dies unterstützt möglicherweise ältere Browser, contains
hat jedoch eine sehr gute Unterstützung.
if (document.body.className.split(/\s+/).indexOf("thatClass") !== -1) {
// has "thatClass"
}
Diese 'hasClass'-Funktion funktioniert in IE8 +, FireFox und 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);
}
Nun, alle oben genannten Antworten sind ziemlich gut, aber hier ist eine kleine einfache Funktion, die ich entwickelt habe. Es funktioniert ziemlich gut.
function hasClass(el, cn){
var classes = el.classList;
for(var j = 0; j < classes.length; j++){
if(classes[j] == cn){
return true;
}
}
}
classList
es eine contains
Methode gibt?
Was denkst du über diesen Ansatz?
<body class="thatClass anotherClass"> </body>
var bodyClasses = document.querySelector('body').className;
var myClass = new RegExp("thatClass");
var trueOrFalse = myClass.test( bodyClasses );
class="nothatClassIsnt"
?
Hier ist der einfachste Weg:
var allElements = document.querySelectorAll('*');
for (var i = 0; i < allElements.length; i++) {
if (allElements[i].hasAttribute("class")) {
//console.log(allElements[i].className);
if (allElements[i].className.includes("_the _class ")) {
console.log("I see the class");
}
}
}
class
Eigenschaft analysieren (bei mehreren Klassen werden mehrere Klassennamen in zufälliger Reihenfolge durch ein Leerzeichen getrennt) und prüfen, ob Ihr Klassenname darin enthalten ist. Nicht furchtbar schwierig, aber immer noch furchtbar unpraktisch, wenn nicht zu Lernzwecken :)