2010-02-04 9 views
89

Estoy tratando de utilizar el "contiene" caso de forma insensible. He intentado utilizar la solución en la siguiente pregunta StackOverflow, pero no funcionó:¿Cómo hago que jQuery contiene mayúsculas y minúsculas, incluido jQuery 1.8+?

Is there a case insensitive jQuery :contains selector?

Para mayor comodidad, 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 yo 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 de la caja de origen sensible "contiene" en el mismo escenario funciona sin errores. ¿Alguien tiene alguna idea? Lo apreciaría.

+0

En caso de que a alguien le interesa, yo he actualizado mi [publicación de blog] (http://wowmotty.blogspot.com/2010/05/jquery-selectors-adding-contains-exact.html) en tres selectores adicionales contiene ': containsExact',': containsExactCase' y ' : los selectores de containsRegex' ahora funcionan en todas las versiones de jQuery. – Mottie

+0

Consulte https://css-tricks.com/snippets/jquery/make-jquery-contains-case-insensitive/, –

Respuesta

124

Esto es lo que estoy usando en un proyecto actual, no he tenido ningún problema. Ver si tiene 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 del API para esto cambió, la versión de jQuery 1.8+ esto sería:

jQuery.expr[":"].Contains = jQuery.expr.createPseudo(function(arg) { 
    return function(elem) { 
     return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0; 
    }; 
}); 

You can test it out here. Para más detalles sobre 1.8+ selectores personalizados, check out the Sizzle wiki here.

+0

Usted es un salvavidas. Gracias. – Matrym

+2

Gracias! Esto todavía funciona perfectamente con jQuery 1.6.1. –

+3

¿Alguna posibilidad de que puedas hablar sobre lo que está haciendo exactamente? –

42

Vale la pena señalar que la respuesta es correcta, pero solo cubre :Contains, y no el alias :contains que podría conducir a un comportamiento inesperado (o podría ser utilizado por diseño para aplicaciones avanzadas que requieren una búsqueda sensible e insensible).

Esto podría resolverse mediante la duplicación de la extensión para el 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 para averiguar por qué no estaba trabajando para mí.

+0

Lo habría comentado anteriormente, pero aparentemente no puedo. – Ellipsis

+5

No estoy seguro de a qué te refieres aquí. Esto anula el comportamiento esperado y documentado de ': contains'. Creo que es más claro dejar el 'original' original solo y llamar a su nuevo selector ': icontains'. –

+5

Eso está al lado de mi mensaje. La creación de un selector alternativo es ciertamente una opción válida, sin embargo, yo estaba señalando que extender: contiene, pero descuida extender: Contiene podría conducir a la confusión del usuario, cuando producen resultados diferentes. – Ellipsis

24

me gustaría hacer algo como esto

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

y dejar solo ... :contains

DEMO

Entonces, ¿por jQuery no admite en su biblioteca ?! si es así de fácil ...

porque Does your code pass the turkey code?

+2

¡Perfecto! Gracias :) – masterchief

+1

Esta debería ser la respuesta aceptada. –

5

Puede ser tarde .... pero,

prefiero ir por este camino ..

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

esta manera , DO NOT alterar con jQuery's NATIVE '.Contiene ... Es posible que tenga un defecto más tarde ... si manipulado, puede que te encuentres de nuevo a Stackoverflow ...

0

me permito añadir mis amigos:

$.expr[":"].containsNoCase = function (el, i, m) { 
    var search = m[3]; 
    if (!search) return false; 
    return eval("/" + search + "/i").test($(el).text()); 
}; 
0

yo era capaz de ignorar mayúsculas y minúsculas de jQuery por completo para lograr lo que quieren mediante el siguiente código:

  $.expr[":"].contains = $.expr.createPseudo(function(arg) { 
      return function(elem) { 
       return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0; 
      }; 
     }); 

puede utilizar este enlace para encontrar ba código sed en sus versiones de jQuery para ignorar mayúsculas y minúsculas, https://css-tricks.com/snippets/jquery/make-jquery-contains-case-insensitive/

Además, si desea utilizar: contiene y hacer un poco de búsqueda es posible que desee echar un vistazo a esto: http://www.ultechspot.com/jquery/using-jquery-search-html-text-and-show-or-hide-accordingly

Cuestiones relacionadas