क्या कोई मामला असंवेदनशील है jQuery: चयनकर्ता शामिल हैं?


145

क्या कोई केस असंवेदनशील संस्करण है : इसमें jQuery का चयनकर्ता शामिल है या मुझे सभी तत्वों पर लूपिंग करके और उनके स्ट्रिंग के लिए (.text) की तुलना करके मैन्युअल रूप से काम करना चाहिए?


2
JQuery 8.1 के लिए + इस उत्तर की
प्रवीण

1
^ यह 1.8.1 है, 8.1 नहीं।
17

यहाँ अच्छा उदाहरण है
at

जवाबों:


125

मैंने jQuery 1.2 के लिए क्या किया है:

jQuery.extend(
    jQuery.expr[':'], { 
        Contains : "jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0" 
});

यह करने के लिए jquery का विस्तार करेगा: इसमें चयनकर्ता होता है जो असंवेदनशील होता है: इसमें चयनकर्ता अपरिवर्तित रहता है।

संपादित करें: jQuery के लिए 1.3 (धन्यवाद @ user95227) और बाद में आपको आवश्यकता है

jQuery.expr[':'].Contains = function(a,i,m){
     return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0;
};

संपादित करें: जाहिरा तौर पर उपयोग करके सीधे DOM तक पहुँचना

(a.textContent || a.innerText || "") 

के बजाय

jQuery(a).text()

पिछली अभिव्यक्ति में इसकी गति काफी बढ़ जाती है इसलिए गति होने पर समस्या होने पर अपने जोखिम पर प्रयास करें। (देखें @ जॉन का सवाल )

नवीनतम संपादन: jQuery 1.8 के लिए यह होना चाहिए:

jQuery.expr[":"].Contains = jQuery.expr.createPseudo(function(arg) {
    return function( elem ) {
        return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
    };
});

बस लोगों को यह बताने की इच्छा थी कि jQuery 1.3 के लिए @Pat और अन्य द्वारा वर्णित समाधान 1.4.3 के लिए भी काम करता है।
जिम एडी

लिंक @ जॉन के प्रश्न / उत्तर के बाद से लिंक यहाँ हटा दिया गया था: stackoverflow.com/questions/1407434/…
Mottie

यह jQuery 1.8 के लिए काम नहीं करता है। एक अद्यतन संस्करण के लिए सीगलजस का जवाब नीचे देखें - stackoverflow.com/a/12113443/560114
मैट ब्राउन

105

इसे वैकल्पिक रूप से असंवेदनशील बनाने के लिए: http://bugs.jquery.com/ticket/278

$.extend($.expr[':'], {
  'containsi': function(elem, i, match, array)
  {
    return (elem.textContent || elem.innerText || '').toLowerCase()
    .indexOf((match[3] || "").toLowerCase()) >= 0;
  }
});

:containsiइसके बजाय का उपयोग करें:contains


3
एक नया फ़ंक्शन जोड़ना मेरे लिए ओवरराइट करने से सबसे अच्छा है, मैं अब इस विकल्प का उपयोग करता हूं (एक आकर्षण की तरह काम करता है)
GôTô

22
यह मानक jquery पुस्तकालय में जोड़ा जाना चाहिए
user482594 16

41

JQuery 1.3 के रूप में, यह विधि पदावनत है। इसे काम करने के लिए इसे एक फ़ंक्शन के रूप में परिभाषित करने की आवश्यकता है:

jQuery.expr[':'].Contains = function(a,i,m){
    return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0;
};

38

अगर किसी (मेरे जैसे) रुचि रखता है कि क्या करना एक और मीटर [3] मतलब में शामिल परिभाषा।


कुंजी / कथा: चयनकर्ताओं की परिभाषाओं में उपयोग के लिए jQuery द्वारा उपलब्ध कराए गए Params:

तत्वों की r = jQuery सरणी की छानबीन की जा रही है। (उदाहरण: r.length = तत्वों की संख्या)

i = सरणी आर के भीतर वर्तमान में तत्व का सूचकांक ।

एक = तत्व वर्तमान में जांच के तहत। चयनकर्ता के कथन को उसके मिलान परिणामों में शामिल करने के लिए सही लौटना चाहिए।

मी [2] = नोडनेम या * कि हम (बृहदान्त्र के बाएं) की तलाश कर रहे हैं।

m [3] = परम: में चयनित: चयनकर्ता (परम)। आमतौर पर एक सूचकांक संख्या, जैसे : nth-of-type (5) , या एक स्ट्रिंग, जैसे : रंग (नीला)


31

JQuery 1.8 में आपको उपयोग करने की आवश्यकता होगी

jQuery.expr[":"].icontains = jQuery.expr.createPseudo(function (arg) {                                                                                                                                                                
    return function (elem) {                                                            
        return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;        
    };                                                                                  
});

2
पूरी तरह से काम किया, धन्यवाद! सिर्फ 1.8 में अपडेट किया गया और इसने काम करना बंद कर दिया।
एंड्रियास

3
अद्यतन के लिए thanx। बस JQuery 1.8 के लिए अद्यतन और यह काम करना बंद कर
वसीम

15

एक भिन्नता जो थोड़ी तेज़ होती है और जो नियमित अभिव्यक्ति की अनुमति देती है:

jQuery.extend (
    jQuery.expr[':'].containsCI = function (a, i, m) {
        //-- faster than jQuery(a).text()
        var sText   = (a.textContent || a.innerText || "");     
        var zRegExp = new RegExp (m[3], 'i');
        return zRegExp.test (sText);
    }
);



न केवल यह मामला असंवेदनशील है, बल्कि यह शक्तिशाली खोजों की अनुमति देता है:

  • $("p:containsCI('\\bup\\b')") ("अप" या "अप" से मेल खाता है, लेकिन "ऊपरी" नहीं, "वेकअप", आदि)
  • $("p:containsCI('(?:Red|Blue) state')") ("लाल राज्य" या "नीला राज्य" से मेल खाता है, लेकिन "अप राज्य" नहीं, आदि)
  • $("p:containsCI('^\\s*Stocks?')") ("स्टॉक" या "स्टॉक" से मेल खाता है, लेकिन केवल पैराग्राफ की शुरुआत में (किसी भी प्रमुख व्हाट्सएप को अनदेखा करते हुए)।

11

देर हो सकती है .... लेकिन,

मैं इस तरह से जाना पसंद करूँगा।

$.extend($.expr[":"], {
"MyCaseInsensitiveContains": function(elem, i, match, array) {
return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
}
});

इस तरह, आप jQuery के NATIVE के साथ छेड़छाड़ नहीं करते हैं। '' अनुरक्षण '' ... आपको बाद में डिफ़ॉल्ट की आवश्यकता हो सकती है ... यदि छेड़छाड़ की जाती है, तो आप अपने आप को वापस ढेर में पा सकते हैं ...


6
jQuery.expr[':'].contains = function(a,i,m){
    return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0;
};

अपडेट कोड 1.3 में बहुत अच्छा काम करता है, लेकिन पिछले उदाहरण के विपरीत पहले अक्षर पर "कम" होना चाहिए।


1
मुझे लगता है कि वह एक अलग समारोह चाहते थे ताकि दोनों :containsऔर :Containsदोनों एक साथ काम करें।
२२:२१ पर २२

": चयनकर्ता अपरिवर्तित रहता है।"
हैरी बी

4

HTML कोड से इसकी केस सेंसिटिविटी को अनदेखा करते हुए टेक्स्ट खोजने के लिए ": समाहित" का उपयोग करने के लिए नीचे देखें।

 $.expr[":"].contains = $.expr.createPseudo(function(arg) {
            return function( elem ) {
                return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
            };
        });
        $("#searchTextBox").keypress(function() {
          if($("#searchTextBox").val().length > 0){
            $(".rows").css("display","none");
            var userSerarchField = $("#searchTextBox").val();
            $(".rows:contains('"+ userSerarchField +"')").css("display","block");
          } else {
            $(".rows").css("display","block");
          }              
        });

आप इस लिंक का उपयोग अपने jquery संस्करण के आधार पर कोड की अनदेखी के मामले को खोजने के लिए भी कर सकते हैं, Make jQuery: Case-Insensitive होता है


2

नियमित अभिव्यक्तियों का उपयोग करके एक तेज़ संस्करण।

$.expr[':'].icontains = function(el, i, m) { // checks for substring (case insensitive)
    var search = m[3];
    if (!search) return false;

    var pattern = new RegExp(search, 'i');
    return pattern.test($(el).text());
};

बहुत ही उत्तम कार्य! आपका बहुत बहुत धन्यवाद। मेरा मानना ​​है कि यह इस सवाल का सबसे अच्छा और सबसे अद्यतित जवाब है।
mavrosxristoforos

0

मुझे काम नहीं करने के साथ एक समान समस्या थी ...

// This doesn't catch flac or Flac
$('div.story span.Quality:not(:contains("FLAC"))').css("background-color", 'yellow');

यह काम करता है और विस्तार की आवश्यकता के बिना

$('div.story span.Quality:not([data*="flac"])').css("background-color", 'yellow');

यह भी काम करता है, लेकिन शायद "मैन्युअल रूप से लूपिंग" श्रेणी में आता है ...।

$('div.story span.Quality').contents().filter(function()
{
  return !/flac/i.test(this.nodeValue);
}).parent().css("background-color", 'yellow');

0

नया वैरिएबल मैं इसे नाम देता हूं सबस्ट्रिंग और उस स्ट्रिंग को डालें जिसे आप कुछ एलिमेंट्स टेक्स्ट में खोजना चाहते हैं। फिर Jquery चयनकर्ता उन चुनिंदा तत्वों का उपयोग करना चाहिए जिनकी आपको मेरे उदाहरण $("elementsYouNeed")और फ़िल्टर द्वारा आवश्यकता है .filter()। इसमें फ़ंक्शन के साथ .filter()प्रत्येक तत्वों की तुलना की जाएगी $("elementsYouNeed")

.toLowerCase()तत्व पाठ के लिए उपयोग होने वाले फ़ंक्शन में भी सबस्ट्रिंग, जो केस सेंसिटिव कंडीशन से बच सकता है और चेक कर सकता है कि उसमें सबस्ट्रिंग है या नहीं। उसके बाद .filter()विधि मिलान तत्वों के एक सबसेट से एक नई jQuery वस्तु का निर्माण करती है।

अब आप matchObjects में मैच एलिमेंट्स पा सकते हैं और जो चाहें कर सकते हैं।

var subString ="string you want to match".toLowerCase();

var matchObjects = $("elementsYouNeed").filter(function () {return $(this).text().toLowerCase().indexOf(subString) > -1;});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.