¿Cómo puedo hacer que jQuery contenga no distinga entre mayúsculas y minúsculas, incluido jQuery 1.8+?
Estoy tratando de usar "contiene" entre mayúsculas y minúsculas sin tener en cuenta. Intenté usar la solución en la siguiente pregunta de stackoverflow, pero no funcionó:
¿Existe un jQuery que no distinga entre mayúsculas y minúsculas: contiene selector?
Por conveniencia, la solución se copia aquí:
jQuery.extend(
jQuery.expr[':'], {
Contains : "jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0"
});
Aquí está el error:
Error: q is not a function
Source File: /js/jquery-1.4.js?ver=1.4
Line: 81
Aquí es donde lo estoy usando:
$('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");
}
});
Mi uso del "contiene" original que distingue entre mayúsculas y minúsculas en el mismo escenario funciona sin ningún error. ¿Alguien tiene alguna idea? Lo apreciaría.
Esto es lo que estoy usando en un proyecto actual, no he tenido ningún problema. A ver si tienes más suerte con este formato:
jQuery.expr[':'].Contains = function(a, i, m) {
return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase()) >= 0;
};
En jQuery 1.8, la API para esto cambió, la versión jQuery 1.8+ de esto sería:
jQuery.expr[":"].Contains = jQuery.expr.createPseudo(function(arg) {
return function( elem ) {
return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
};
});
Puedes probarlo aquí . Para obtener más detalles sobre los selectores personalizados 1.8+, consulte la wiki de Sizzle aquí .
Vale la pena señalar que la respuesta es correcta pero solo cubre :Contains
y no el alias :contains
que podría provocar un comportamiento inesperado (o podría usarse por diseño para aplicaciones avanzadas que requieren búsquedas sensibles e insensibles).
Esto podría resolverse duplicando la extensión del 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;
};
Me tomó un tiempo descubrir por qué no me funcionaba.
yo haría algo como esto
$.expr[':'].containsIgnoreCase = function (n, i, m) {
return jQuery(n).text().toUpperCase().indexOf(m[3].toUpperCase()) >= 0;
};
Y déjalo :contains
en paz...
MANIFESTACIÓN
Entonces, ¿por qué jQuery no lo admite en su biblioteca? si es asi de facil....
porque ¿ tu código pasa el código de pavo?
Puede que sea tarde... pero,
Preferiría ir por este camino..
$.extend($.expr[":"], {
"MyCaseInsensitiveContains": function(elem, i, match, array) {
return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
}
});
De esta manera, NO alteres el NATIVO '.contains' de jQuery ... Es posible que necesites el predeterminado más adelante... si lo manipulas, es posible que regreses a stackOverFlow ...