not javascript jquery jquery-selectors

javascript - not - ¿Hay un caso jQuery insensible: contiene el selector?



jquery parent (11)

¿Existe una versión insensible a mayúsculas / minúsculas de :contains selector jQuery o debería hacer el trabajo manualmente al pasar el cursor sobre todos los elementos y comparar su .text () con mi cadena?


A partir de jQuery 1.3, este método está en desuso. Para que esto funcione, debe definirse como una función:

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


En jQuery 1.8 necesitarás usar

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


Lo que terminé haciendo para jQuery 1.2 es:

jQuery.extend( jQuery.expr['':''], { Contains : "jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0" });

Esto ampliará jquery para tener un: Contiene un selector que no distingue entre mayúsculas y minúsculas, el selector: contains permanece sin cambios.

Editar: para jQuery 1.3 (gracias @ user95227) y luego necesita

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

Editar: al parecer, acceder al DOM directamente mediante el uso

(a.textContent || a.innerText || "")

en lugar de

jQuery(a).text()

En la expresión anterior, se acelera considerablemente, así que prueba bajo tu propio riesgo si la velocidad es un problema. (vea la question @John )

Última edición: para jQuery 1.8 debería ser:

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


Para que, opcionalmente, no distinga entre mayúsculas y minúsculas: http://bugs.jquery.com/ticket/278

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

luego use :containsi lugar de :contains


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

De esta manera, NO manipulas los NATIVE ''.contains'' de jQuery ... Es posible que necesites el predeterminado una vez más ... si se manipula, puedes volver a ...


Si alguien (como yo) está interesado, ¿qué significa a y m [3] en Definición de contenido?

CLAVE / LEYENDA: Parámetros puestos a disposición por jQuery para su uso en las definiciones del selector:

r = jQuery matriz de elementos que se escudriñan. (por ejemplo: r.length = Número de elementos)

i = índice del elemento actualmente bajo escrutinio, dentro de la matriz r .

a = elemento actualmente bajo escrutinio. La declaración del selector debe devolver verdadero para incluirlo en sus resultados coincidentes.

m [2] = nodeName o * que buscamos (a la izquierda de dos puntos).

m [3] = param pasado al selector: (param). Típicamente un número de índice, como en : n-ésimo tipo (5) , o una cadena, como en : color (azul) .


Tuve un problema similar con el siguiente no funciona ...

// This doesn''t catch flac or Flac $(''div.story span.Quality:not(:contains("FLAC"))'').css("background-color", ''yellow'');

Esto funciona y sin la necesidad de una extensión

$(''div.story span.Quality:not([data*="flac"])'').css("background-color", ''yellow'');

Esto también funciona, pero probablemente entra en la categoría "bucle manual" ...

$(''div.story span.Quality'').contents().filter(function() { return !/flac/i.test(this.nodeValue); }).parent().css("background-color", ''yellow'');


Una variación que parece funcionar un poco más rápido y que también permite expresiones regulares es:

jQuery.extend ( jQuery.expr['':''].containsCI = function (a, i, m) { //-- faster than jQuery(a).text() var sText = (a.textContent || a.innerText || ""); var zRegExp = new RegExp (m[3], ''i''); return zRegExp.test (sText); } );


No solo es insensible a mayúsculas / minúsculas, sino que permite búsquedas potentes como:

  • $("p:containsCI(''//bup//b'')") (Coincide con "Arriba" o "Arriba", pero no "arriba", "activación", etc.)
  • $("p:containsCI(''(?:Red|Blue) state'')") (Coincide con "estado rojo" o "estado azul", pero no con "estado activo", etc.)
  • $("p:containsCI(''^//s*Stocks?'')") (Coincide con "stock" o "stocks", pero solo al comienzo del párrafo (ignorando cualquier espacio en blanco inicial).

Una versión más rápida usando expresiones regulares.

$.expr['':''].icontains = function(el, i, m) { // checks for substring (case insensitive) var search = m[3]; if (!search) return false; var pattern = new RegExp(search, ''i''); return pattern.test($(el).text()); };


Use el código siguiente para usar ": contains" para encontrar texto ignorando la sensibilidad de mayúsculas y minúsculas de un código HTML.

$.expr[":"].contains = $.expr.createPseudo(function(arg) { return function( elem ) { return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0; }; }); $("#searchTextBox").keypress(function() { if($("#searchTextBox").val().length > 0){ $(".rows").css("display","none"); var userSerarchField = $("#searchTextBox").val(); $(".rows:contains(''"+ userSerarchField +"'')").css("display","block"); } else { $(".rows").css("display","block"); } });

Puede usar este enlace para obtener más información sobre esto, usar jQuery para buscar texto HTML y mostrar u ocultar en consecuencia

También puede usar este enlace para encontrar el código igonring de caso basado en su versión de jquery, Make jQuery: contains Case-Insensitive


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

El código de actualización funciona muy bien en 1.3, pero "contiene" debe estar en minúscula en la primera letra a diferencia del ejemplo anterior.