Comment puis-je rendre jQuery insensible à la casse, y compris jquery 1.8+?

J'essaie d'utiliser "contains" de manière insensible à la casse. J'ai essayé d'utiliser la solution à la question stackoverflow suivante, mais cela n'a pas fonctionné:

Y a-t-il un sélecteur jQuery :contains insensible à la casse?

Pour plus de commodité, la solution est copié ici:

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

Voici le message d'erreur:

Error: q is not a function
Source File: /js/jquery-1.4.js?ver=1.4
Line: 81

Voici où je l'utilise:

  $('input.preset').keyup(function() {
    $(this).next().find("li").removeClass("bold");
    var theMatch = $(this).val();
    if (theMatch.length > 1){
      theMatch = "li:Contains('" + theMatch + "')";
      $(this).next().find(theMatch).addClass("bold");
    }
  });

Mon utilisation de la casse d'origine "contient" dans le même scénario fonctionne sans toutes les erreurs. Quelqu'un aurait-il des idées? Je l'apprécierais.

91
demandé sur Community 2010-02-04 03:51:53

6 réponses

C'est ce que j'utilise dans un projet en cours, je n'ai eu aucun problème. Voyez si vous avez plus de chance avec ce format:

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

Dans jQuery 1.8 l'API pour cela a changé, la version jquery 1.8 + de ceci serait:

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

Vous pouvez le tester ici. Pour plus de détails sur les sélecteurs personnalisés 1.8+, consultez le wiki Sizzle ici .

126
répondu Nick Craver 2012-08-10 12:40:54

Il est à noter que la réponse est correcte mais ne couvre que :Contains, et non l'alias :contains qui pourrait conduire à un comportement inattendu (ou pourrait être utilisé par la conception pour des applications avancées nécessitant à la fois une recherche sensible et insensible).

Cela peut être résolu en dupliquant l'extension de l'alias:

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

J'ai mis du temps à comprendre pourquoi ça ne marchait pas pour moi.

43
répondu Ellipsis 2011-04-27 04:31:48

Je ferais quelque chose comme ça

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

Et Laissez :contains Tranquille...

DÉMO

Alors pourquoi jQuery ne le supporte pas dans sa bibliothèque?! si c'est si facile...

Parce que votre code passe-t-il le code de la dinde?

26
répondu Mina Gabriel 2014-05-23 12:13:18

Peut être en retard.... mais,

Je préfère aller par là..

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

De cette façon, vous N'altérez pas le natif de jQuery '.contient " ... Vous devrez peut-être celui par défaut plus tard...si altéré, vous pourriez vous retrouver à stackOverFlow...

5
répondu ErickBest 2013-05-27 16:16:17

Je vais me permettre d'ajouter mes amis:

$.expr[":"].containsNoCase = function (el, i, m) { 
    var search = m[3]; 
    if (!search) return false; 
    return eval("/" + search + "/i").test($(el).text()); 
}; 
0
répondu bresleveloper 2014-02-11 08:38:51

J'étais juste capable d'ignorer complètement la sensibilité à la casse de jQuery pour réaliser ce que je veux en utilisant le code ci-dessous:

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

Vous pouvez utiliser ce lien pour trouver du code basé sur vos versions jQuery pour ignorer la sensibilité à la casse, https://css-tricks.com/snippets/jquery/make-jquery-contains-case-insensitive/

Aussi, si vous voulez utiliser: contient et faire une recherche, vous pouvez jeter un oeil à ceci: http://technarco.com/jquery/using-jquery-search-html-text-and-show-or-hide-accordingly

0
répondu Umesh Patil 2018-06-15 09:42:16