93 votes

Comment rendre les conteneurs jQuery insensibles à la casse, y compris pour jQuery 1.8+ ?

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

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

Par 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

Voilà 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");
    }
  });

Dans le même scénario, j'utilise le mot "contains" original, sensible à la casse, sans aucune erreur. Quelqu'un a-t-il une idée ? Je vous en serais reconnaissant.

0 votes

Au cas où quelqu'un serait intéressé, j'ai mis à jour mes article de blog sur trois sélecteurs de contenu supplémentaires :containsExact , :containsExactCase et :containsRegex pour que les sélecteurs fonctionnent désormais dans toutes les versions de jQuery.

0 votes

0 votes

Je pense que .filter() est un autre bon moyen. Référence

129voto

Nick Craver Points 313913

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 la version 1.8 de jQuery, l'API a été modifiée. La version jQuery 1.8+ serait la suivante :

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 de la version 1.8+, Consultez le wiki Sizzle ici .

0 votes

Vous êtes un sauveur de vies. Merci.

3 votes

Pourriez-vous nous expliquer ce que fait exactement ce système ?

4 votes

@ClovisSix - merci pour l'info, j'ai fourni une méthode 1.8+ pour faire la même chose, faites-moi savoir si vous avez des problèmes.

43voto

Ellipsis Points 444

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

Cela pourrait ê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.

0 votes

Je l'aurais bien commenté plus haut, mais apparemment je ne peux pas le faire.

5 votes

Je ne suis pas sûr de ce que vous voulez dire ici. Cela remplace le comportement attendu, documenté de :contains . Je pense que c'est plus clair de laisser l'original :contains seul et appelez votre nouveau sélecteur :icontains .

5 votes

Ce n'est pas le sujet de mon message. La création d'un sélecteur alternatif est certainement une option valable, mais je soulignais que le fait d'étendre :contains, mais de négliger d'étendre :Contains, pouvait entraîner une confusion chez l'utilisateur, lorsque les résultats sont différents.

27voto

Mina Gabriel Points 2172

Je ferais quelque chose comme ça

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

Et partir :contains Seul...

DEMO

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

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

6voto

ErickBest Points 959

Peut être en retard de .... 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 NE PAS d'altérer la fonction NATIVE de jQuery .contains ... Vous aurez peut-être besoin de la version par défaut plus tard... si vous la modifiez, vous risquez de vous retrouver dans la situation suivante stackOverFlow ...

0voto

bresleveloper Points 792

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X