¿Cómo puedo hacer que jQuery contenga no distinga entre mayúsculas y minúsculas, incluido jQuery 1.8+?

Resuelto Matrym asked hace 14 años • 6 respuestas

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.

Matrym avatar Feb 04 '10 07:02 Matrym
Aceptado

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í .

Nick Craver avatar Feb 04 '2010 00:02 Nick Craver

Vale la pena señalar que la respuesta es correcta pero solo cubre :Containsy no el alias :containsque 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.

Ellipsis avatar Apr 27 '2011 04:04 Ellipsis

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 :containsen 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?

Mina Gabriel avatar Feb 22 '2013 21:02 Mina Gabriel

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 ...

ErickBest avatar May 27 '2013 16:05 ErickBest