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.
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 .
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.
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...
Alors pourquoi jQuery ne le supporte pas dans sa bibliothèque?! si c'est si facile...
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...
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());
};
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