सादे जावास्क्रिप्ट के साथ "hasClass" फ़ंक्शन क्या है?


313

आप jQuery के hasClassसादे ओल 'जावास्क्रिप्ट के साथ कैसे करते हैं ? उदाहरण के लिए,

<body class="foo thatClass bar">

अगर <body>यह पूछने के लिए जावास्क्रिप्ट तरीका क्या है thatClass?


मुझे लगता है कि आपको classसंपत्ति को पार्स करना होगा (जो कि कई वर्गों के मामले में एक स्थान से अलग यादृच्छिक क्रम में कई वर्ग नाम होंगे) और जांचें कि क्या आपके वर्ग का नाम इसमें है। बहुत मुश्किल नहीं है, लेकिन अभी भी बहुत असुविधाजनक है अगर सीखने के उद्देश्यों के लिए नहीं :)
Pekka

7
नहीं जानता कि अगर मैं पार्टी लेकिन एक अच्छी साइट है कि jQuery कार्यों के लिए विकल्प देता है के लिए देर हो रही है है youmightnotneedjquery.com
Ithil

जवाबों:


116

आप देख सकते हैं कि क्या element.classNameमैच /\bthatClass\b/
\bएक शब्द विराम से मेल खाता है।

या, आप jQuery के अपने कार्यान्वयन का उपयोग कर सकते हैं:

var className = " " + selector + " ";
if ( (" " + element.className + " ").replace(/[\n\t]/g, " ").indexOf(" thatClass ") > -1 ) 

अपने अधिक सामान्य प्रश्न का उत्तर देने के लिए, आप विशेष रूप से इस स्रोत दर्शक में जीथ्यू या स्रोत पर jQuery के स्रोत कोड को देख सकते हैं ।hasClass


6
JQuery के कार्यान्वयन के लिए +1 (ऊपर देखने के लिए (क्या यह उचित अंग्रेजी है? rclassवास्तव में क्या है? ))
फेलिक्स क्लिंग

6
\b"ThatClass-anotherClass" से मेल नहीं खाएगा?
मैथ्यू क्रुमले

3
बस पूर्णता के लिए: हाल के संस्करणों में rclass है "/ [[\ n \ t \ r] / g" (\ r गयी)
फेलिक्स श्वार्ज

4
@FelixSchwarz सही है, वर्तमान jQuery में regexp को अपडेट किया गया था /[\t\r\n\f]/g। यह भी उल्लेख करना अच्छा है कि माइनस साइन के /\bclass\b/साथ क्लासनाम के लिए असफल हो सकता है -( इसके अलावा यह अच्छा काम करता है), यही कारण है कि jQuery का कार्यान्वयन बेहतर और अधिक विश्वसनीय है। उदाहरण के लिए: /\bbig\b/.test('big-text')प्रत्याशित असत्य के बजाय सही लौटाता है।
स्टेनो

994

बस उपयोग करें 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');

ब्राउज़र समर्थन:

  • क्रोम 8.0
  • फ़ायरफ़ॉक्स 3.6
  • IE १०
  • ओपेरा 11.50
  • सफारी 5.1

classList ब्राउज़र का समर्थन


5
यह IE8 में असमर्थित है । IE8 .classListएक स्ट्रिंग के रूप में पुनः प्राप्त कर सकता है , लेकिन यह अधिक आधुनिक तरीकों को मान्यता नहीं देगा जैसे कि.classList.contains()
आयनो

7
@iono में Element.classList MDN से कार्यान्वयन विवरण वहाँ एक शिम कि IE8 को यह व्यवहार करने के लिए सहायता प्रदान करता है developer.mozilla.org/en-US/docs/Web/API/Element/classList
जेम्स

3
मैं @AlexanderWigmore से सहमत हूं, यह अविश्वसनीय रूप से सहायक और सरल था।
जैक्स ओलिवियर

इसको वोट करता है। यह क्‍वेरी क्‍लास का एक बहुत ही स्‍वच्‍छ तरीका है
user2190488

@ एसएलएसी को यह पहले से ही स्वीकृत उत्तर होने के लिए अद्यतन किया जाना चाहिए।
उमुर करागोज

35

सबसे प्रभावी एक लाइनर है कि

  • एक बूलियन लौटाता है (परिक्रमा के उत्तर के विपरीत)
  • thisClassउस तत्व की खोज करते समय एक झूठी सकारात्मक वापस नहीं करता है class="thisClass-suffix"
  • कम से कम IE6 के लिए नीचे हर ब्राउज़र के साथ संगत है

function hasClass( target, className ) {
    return new RegExp('(\\s|^)' + className + '(\\s|$)').test(target.className);
}

28

वह गुण जो उपयोग में आने वाली कक्षाओं को संग्रहीत करता है className

तो आप कह सकते हैं:

if (document.body.className.match(/\bmyclass\b/)) {
    ....
}

यदि आप ऐसा स्थान चाहते हैं जो आपको दिखाए कि jQuery सब कुछ कैसे करता है, तो मैं सुझाव दूंगा:

http://code.jquery.com/jquery-1.5.js


1
अति उत्कृष्ट। matchविशेषता फिर से काम आता है! क्या वास्तव में jQuery जावास्क्रिप्ट में संभव से अधिक कुछ करता है ?! यदि नहीं, तो jQuery शॉर्टहैंड का एक अनावश्यक वजन है।
अणिमासीजा

1
यह भी मेल खाता है myclass-something, जैसा कि \bमैच हाइफ़न।
मार्क डर्डिन

1
@animaacija सभी जावास्क्रिप्ट पुस्तकालय / प्लगइन्स मूल रूप से जावास्क्रिप्ट शॉर्टहैंड हैं क्योंकि वे जावास्क्रिप्ट के साथ निर्मित होते हैं। बात यह है: आशुलिपि हमेशा आवश्यक हैं। पहिए को कभी भी मजबूत न करें।
एडविन स्टेलर

यह एक महान उपाय है!
मैनुअल अबास्कल

28

// 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>


4
@greg_diesel: उत्तरों को हतोत्साहित न करें! आम समस्याओं के नए समाधान स्वागत से अधिक हैं।
raveren

2
@ रेवरेन जबकि पुरानी समस्याओं के नए समाधानों का स्वागत किया जाता है, यह विशेष उत्तर कुछ नया नहीं लाता है। यह केवल इस सवाल पर शोर जोड़ता है।
एमिल बर्जरॉन

1
@raveren यह कोई नया समाधान नहीं है, यह इस उत्तर के समान है लेकिन कम जानकारी के साथ है।
निधि मोनिका का मुकदमा

13

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();
    }
};

निष्कासन कार्य:

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();
};

11

मैं एक सरल / न्यूनतम समाधान, एक लाइन, क्रॉस ब्राउज़र का उपयोग करता हूं, और विरासत ब्राउज़र के साथ भी काम करता हूं:

/\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;
}

अन्य वर्ग हेरफेर के लिए, यहां पूरी फ़ाइल देखें ।


2
क्या यह यात्रा किसी वर्ग पर होगी notmyClassHere?
टेपेइमम

2
अगर आपकी क्लास वहाँ के रूप में अच्छी नहीं है पूछ सकते हैं !/myClass/.test(document.body.className)नोटिस !प्रतीक।
thnnp

1
मैं सवाल को नकारने की बात नहीं कर रहा हूं। मैं सोच रहा हूं कि यदि क्लास का नाम है तो आपका फ़ंक्शन अनुचित रूप से वापस आ जाएगा thisIsmyClassHere
तेईपेमम

1
मैं केवल अनुमान लगा रहा था कि आप के बारे में क्या पूछते हैं, समझ में नहीं आया कि आपको क्या चाहिए, लेकिन क्या आपने इसे आजमाया है और यह सच / गलत को वापस करने में विफल रहा है जैसा कि आपको चाहिए?
17

2
यह सही नहीं है क्योंकि यह सबस्ट्रिंग प्रूफ नहीं है। जैसे जब document.body.className = 'myClass123', तो /myClass/.test(document.body.className) वापस लौटें ...
Zbigniew Wiadro

9

इसके लिए एक अच्छा उपाय है क्लासिस्ट के साथ काम करना और उसमें शामिल होना।

मैंने इसे इस तरह किया:

... for ( var i = 0; i < container.length; i++ ) {
        if ( container[i].classList.contains('half_width') ) { ...

तो आपको अपने तत्व की आवश्यकता है और कक्षाओं की सूची की जांच करें। यदि कोई एक वर्ग समान है, तो आप जिसको खोजते हैं, वह सही लौटेगा या नहीं, यदि वह गलत नहीं लौटेगा!


6

कुछ का उपयोग करें:

Array.prototype.indexOf.call(myHTMLSelector.classList, 'the-class');

3
के बराबर नहीं है myHTMLSelector.classList.indexOf('the-class')? क्या आप भी >=0अंत में नहीं चाहते हैं ?
तेईपेमम

5
[].indexOfयदि classListकोई containsविधि है तो उपयोग करने की क्या बात है ?
ओरिऑल

@ टिफिम नं। myHTMLSelector.classList.indexOf('the-class')त्रुटि देता है myHTMLSelector.classList.indexOf is not a functionक्योंकि myHTMLSelector.classListकोई सरणी नहीं है। लेकिन मुझे लगता है कि जब Array.prototypeकुछ रूपांतरण का उपयोग करके इसे कॉल किया जाता है। यह पुराने ब्राउज़र का समर्थन कर सकता है, हालाँकि containsइसमें बहुत अच्छा समर्थन है।
एहसान88


2

IE8 +, फ़ायरफ़ॉक्स और क्रोम में यह 'hasClass' फ़ंक्शन काम करता है:

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);
}

1

अच्छी तरह से उपरोक्त सभी उत्तर बहुत अच्छे हैं, लेकिन यहां एक छोटा सा सरल कार्य है जिसे मैंने कोड़ा। यह बहुत अच्छी तरह से काम करता है।

function hasClass(el, cn){
    var classes = el.classList;
    for(var j = 0; j < classes.length; j++){
        if(classes[j] == cn){
            return true;
        }
    }
}

3
यदि classListएक containsविधि है, तो इसका क्या मतलब है ?
ओरिऑल

1

आप इस दृष्टिकोण के बारे में क्या सोचते हैं?

<body class="thatClass anotherClass"> </body>

var bodyClasses = document.querySelector('body').className;
var myClass = new RegExp("thatClass");
var trueOrFalse = myClass.test( bodyClasses );

https://jsfiddle.net/5sv30bhe/


2
मुझे लगता है कि आप अपने चर नामों (सक्रिय === myClass?) को मिला रहे हैं। लेकिन इस दृष्टिकोण के लिए एक झूठी सकारात्मक नहीं देंगे class="nothatClassIsnt"?
तेईपेमम

0

यहाँ सबसे आसान तरीका है:

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");
         }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.