JQuery। If एक बयान में कई मानों के लिए क्लिक करें


81

मेरे पास एक सरल कथन है जैसे कि:

if ($('html').hasClass('m320')) {

// do stuff 

}

यह उम्मीद के मुताबिक काम करता है। हालांकि, मैं if statementयह जांचने के लिए अधिक कक्षाओं को जोड़ना चाहता हूं कि <html>टैग में कोई भी कक्षाएं मौजूद हैं या नहीं । मुझे इसकी आवश्यकता है इसलिए यह उन सभी में से नहीं है, बल्कि कम से कम एक वर्ग की उपस्थिति है लेकिन यह अधिक हो सकता है।

मेरा उपयोग मामला यह है कि मेरे पास विभिन्न व्यूपोर्ट चौड़ाई के लिए कक्षाएं (उदाहरण के लिए) जोड़ी गई हैं m320, m768इसलिए मैं केवल एक विशिष्ट चौड़ाई (वर्ग) होने पर कुछ जॉकरी निष्पादित करना चाहता हूं।

यहाँ मैं क्या अब तक की कोशिश की है:

1 है।

if ($('html').hasClass('m320', 'm768')) {

// do stuff 

}

2।

if ($('html').hasClass('m320')) || ($('html').hasClass('m768')) {

 // do stuff 

}

३।

 if ($('html').hasClass(['m320', 'm768'])) {

 // do stuff 

    }

हालांकि इनमें से कोई भी काम नहीं करता है। मुझे यकीन नहीं है कि मैं क्या गलत कर रहा हूं, लेकिन सबसे अधिक संभावना मेरे वाक्यविन्यास या संरचना की है।


1
API कैसे काम करता है, इसका अनुमान लगाने के बजाय, आपको डॉक्स पढ़ना चाहिए। api.jquery.com/hasclass इसके अलावा, आपको अपने डेवलपर के कंसोल को डेवलपमेंट के दौरान आसान / खुला होना चाहिए।
पागलपन की चट्टान

जवाबों:


74

आपने अपने 2 वें प्रयास में कुछ कोष्ठक गड़बड़ कर दिए थे।

var $html = $("html");

if ($html.hasClass('m320') || $html.hasClass('m768')) {

  // do stuff 

}

6
आपको वास्तव $('html')में इसे कई बार देखने के बजाय एक चर में कैश करना चाहिए ।
epascarello

1
@epascarello बहुत सच है, पोस्टरिटी के लिए जवाब अपडेट कर रहा है।
जेम्स मॉन्टेन

163

आप is()इसके बजाय उपयोग कर सकते हैं hasClass():

if ($('html').is('.m320, .m768')) { ... }

3
हाँ hasClass()शायद तेज़ है, लेकिन is()ज्यादातर समय सुविधाजनक है
एलक्लेनार्स

1
BTW यहाँ हम प्रदर्शन बेंचमार्क के लिए देख सकते हैं is()औरhasClass()
जिग्नेश Gohel

1
तो यह बहुत धीमा है, लेकिन समग्र रूप से सुपर फास्ट भी है। यदि केवल कुछ आइटम स्कैन किए जा रहे हैं, तो लगता है कि बहुत क्लीनर कोड के लिए कोई बड़ी बात नहीं है।
jerclarke

28

मज़े के लिए, मैंने एक छोटा 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/


बहुत बढ़िया, यह अच्छी तरह से काम करता है ... क्रॉस-ब्राउज़र भी! एफएफ और आईई पर परीक्षण किया गया।
crampicco

मैंने .addClass और .removeClass () के लिए jQuery सम्मेलनों के अनुरूप बनाने के लिए एक मामूली मॉड बनाया। ( stackoverflow.com/a/14887517/170456 )
साइबरमॉन्क

25

यह एक और समाधान हो सकता है:

if ($('html').attr('class').match(/m320|m768/)) {  
  // do stuff   
}  

jsperf.com के अनुसार यह काफी तेज है।


बहुत अच्छा, बहुत तेज!
फिलिप 13

9
यह क्लास 'ZZZm320WWW' और पसंद से भी मेल खाएगा। कोशिश करें ... मैच (/ \ b (m320 | m768) \ b /) जहां \ b का मिलान किसी शब्द की शुरुआत और अंत है।
जुआन लानुस

बस अनुवर्ती (7 साल बाद :))। यह बहुत अच्छा काम करता है लेकिन अगर आपके द्वारा परिभाषित html तत्व में कोई भी वर्ग नहीं है - तो यह अपरिभाषित त्रुटि के 'नॉट रीड प्रॉपर्टी "मैच को शूट करेगा। यदि यह मामला है, तो परीक्षण करें कि क्या तत्व में भी 'वर्ग' विशेषता है (या यह सुनिश्चित करने के लिए परीक्षण करें कि विशेषता 'वर्ग' सुस्त नहीं है)।
सान्या

5

इन सभी विभिन्न विकल्पों में से कुछ अलग प्रदर्शन पहलुओं के बारे में सोच रहे लोगों के लिए, मैंने यहाँ एक jsperf केस बनाया है: jsperf

संक्षेप में, उपयोग element.hasClass('class')करना सबसे तेज़ है।

अगला सबसे अच्छा दांव उपयोग कर रहा है elem.hasClass('classA') || elem.hasClass('classB')। इस पर एक नोट: आदेश मायने रखता है! यदि वर्ग 'क्लास' मिलने की अधिक संभावना है, तो इसे पहले सूचीबद्ध करें! या हालत बयानों में से एक के मिलते ही वापस आ जाते हैं।

अब तक का सबसे खराब प्रदर्शन था element.is('.class')

इसके अलावा jsperf में सूचीबद्ध है CyberMonk का फ़ंक्शन और कोलजा का समाधान


बहुत दिलचस्प! मुझे jsperf के बारे में कोई जानकारी नहीं थी। सभी विभिन्न रूपों को दर्शाने के लिए धन्यवाद।
डैनी इंग्लैंडर

3

यहाँ 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') बुलेटप्रूफिंग की आवश्यकता है, निश्चित रूप से, यह कम से कम एक तर्क मानता है।


0
var classes = $('html')[0].className;

if (classes.indexOf('m320') != -1 || classes.indexOf('m768') != -1) {
    //do something
}

1
यदि आप ऐसा करने जा रहे हैं, तो तत्व प्राप्त करने के लिए jquery का उपयोग करके भी परेशान क्यों करें?
जेम्स मॉन्टेन

खैर, मैं नहीं, लेकिन कम से कम यह केवल एक बार कक्षाएं हो जाता है? यह सिर्फ एक छोटे से jQuery के बिना इतना सुस्त लग रहा था, इसलिए मैं सिर्फ तुम्हारे लिए कुछ jQ जादू के साथ getElementsByTagName को बदल दिया!
एडेनो

0

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

0

यह उस स्थिति में है जब आपको दोनों वर्गों की आवश्यकता है। या तो तर्क या सिर्फ उपयोग के लिए ||

$('el').hasClass('first-class') || $('el').hasClass('second-class')

आवश्यकतानुसार बेझिझक अनुकूलन करें


1
ये गलत है। पहला उदाहरण आपने काम दिया क्योंकि विधि में इनपुट का खराब संकरण है और सोचता है कि संपूर्ण स्ट्रिंग एक वर्ग नाम है। यह काम नहीं करता है यदि कक्षाएं एक अलग क्रम में हैं, या एक दूसरे के ठीक बगल में नहीं हैं। उदाहरण देखें: jsfiddle.net/0d57ekty
MightyPork

@MightyPork जाँच के लिए धन्यवाद। आप सही कह रहे हैं, इसका उपयोग केवल कक्षा में ही किया जाना चाहिए
qwerty_igor

-1

इसे इस्तेमाल करे:

if ($('html').hasClass('class1 class2')) {

// do stuff 

}

ढेर अतिप्रवाह में आपका स्वागत है! कृपया कुछ स्पष्टीकरण जोड़ें कि यह कोड ओपी की मदद क्यों करता है। यह एक उत्तर देने में मदद करेगा जिससे भविष्य के दर्शक सीख सकते हैं। अधिक जानकारी के लिए उत्तर कैसे देखें ।
हेट्रिक मंकी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.