web-dev-qa-db-fra.com

Comment rendre jQuery Contient insensible à la casse, y compris jQuery 1.8+?

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

Existe-t-il une jQuery insensible à la casse: contient un sélecteur?

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

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

Voici l'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 aucune erreur. Quelqu'un a-t-il une idée? J'apprécierais.

91
Matrym

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 .

127
Nick Craver

Il convient de 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 qui nécessitent une recherche sensible et insensible).

Cela pourrait être résolu en dupliquant l'extension pour 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; 
};

Cela m'a pris un certain temps pour comprendre pourquoi cela ne fonctionnait pas pour moi.

43
Ellipsis

Je ferais quelque chose comme ça

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

Et part :contains Seul...

DÉMO

Alors pourquoi jQuery ne le supporte pas dans sa bibliothèque?! si c'est aussi simple que ça ...

parce que Votre code passe-t-il le code de la Turquie?

27
Mina Gabriel

Peut être en retard .... mais,

Je préfère aller dans ce sens ..

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

De cette façon, vous NE PAS falsifier le NATIVE de jQuery '. Contient' ... Vous aurez peut-être besoin de celui par défaut plus tard. ..si vous avez trafiqué, vous pourriez vous retrouver dans stackOverFlow ...

5
ErickBest

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
bresleveloper

J'ai juste pu ignorer complètement la sensibilité à la casse de jQuery pour atteindre 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 de jQuery pour ignorer la casse, https://css-tricks.com/snippets/jquery/make-jquery-contains-case-insensitive/

De plus, si vous souhaitez utiliser: contient et effectuez une recherche, vous pouvez y jeter un œil: http://technarco.com/jquery/using-jquery-search-html-text-and-show- ou-cacher-en conséquence

0
Umesh Patil