2008-10-09 15 views

Respuesta

116

Lo que terminé haciendo para jQuery 1.2 es:

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

Esto extenderá jQuery para tener una: Contiene selector que es sensible a mayúsculas, la: contiene el selector se mantiene sin cambios.

Editar: Para jQuery 1.3 (gracias @ user95227) y más tarde lo que necesita

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

Editar: acceder a parecer el DOM directamente usando

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

en lugar de

jQuery(a).text() 

En la expresión anterior, la acelera considerablemente, así que inténtalo bajo tu propio riesgo si la velocidad es un problema. (Ver @John 's question)

Última edición: Para jQuery 1.8 que debe ser:

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

Solo quería que la gente supiera que la solución descrita por @Pat y otros para jQuery 1.3 también funciona para 1.4.3. –

+0

Enlace a la pregunta/respuesta de @John puesto que se eliminó el enlace aquí: http://stackoverflow.com/questions/1407434/is-there-any-way-to-speed-up-this-solution-for-a-case -insensitive-jquery-contai – Mottie

+0

Esto no funciona para jQuery 1.8. Ver la respuesta de seagullJS a continuación para una versión actualizada - http://stackoverflow.com/a/12113443/560114 –

34

Si alguien (como yo) le interesa lo que no un y m [3] significa en Contiene definición.


KEY/LEGEND: Parámetros puestos a disposición por jQuery para su uso en las definiciones de selector:

r = jQuery matriz de elementos siendo examinada. (Por ejemplo: r.length = Número de elementos)

i = índice de 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 estamos buscando (a la izquierda de dos puntos).

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

39

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

jQuery.expr[':'].Contains = function(a,i,m){ 
    return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0; 
}; 
6
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 ser minúscula en la primera letra a diferencia del ejemplo anterior.

+1

Creo que quería una función distinta para que tanto ': contains' como': Contains' funcionaran simultáneamente. – joshperry

+0

"el selector: contains permanece sin cambios". –

94

Para que sea dado el caso insensible: 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; 
    } 
}); 

a continuación, utilizar :containsi en lugar de :contains

+3

agregar una nueva función es mejor que sobrescribirme, ahora uso esta opción (funciona como un amuleto) –

+20

esto debe agregarse a la biblioteca estándar de jquery – user482594

15

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



Esto no sólo es sensible a las mayúsculas, pero permite búsquedas potentes como:

  • $("p:containsCI('\\bup\\b')") (Partidos "arriba" o "hacia arriba", pero no "despertar" "superior", etc.)
  • $("p:containsCI('(?:Red|Blue) state')") (Partidos "estado rojo" o "estado azul", pero no "seguridad del estado", etc.)
  • $("p:containsCI('^\\s*Stocks?')") (Partidos "reserva" o "stocks", pero sólo al comienzo de la párrafo (ignorando cualquier espacio en blanco inicial).
28

En jQuery 1.8, necesitará utilizar

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

¡Funcionó perfectamente, gracias! Acabo de actualizar a 1.8 y esto dejó de funcionar. – Andreas

+2

gracias por la actualización. Acabo de actualizar a JQuery 1.8 y dejó de funcionar – Wasim

9

Puede ser 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 forma, usted NO HACER alterar el NATIVE de jQuery '.contains' ... Es posible que necesite el predeterminado después ... si manipulado, puede que te encuentres de nuevo a Stackoverflow ...

4

uso por debajo de código para utilizar ": contiene" para buscar texto ignorando su sensibilidad caso 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"); 
      }    
     }); 

Se puede usar este enlace para encontrar más información sobre esto, Use jQuery to search HTML text and show or hide accordingly

también puede utilizar este enlace para encontrar el caso igonring código basado en la versión de jQuery, Make jQuery :contains Case-Insensitive

0

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 funciona también, pero probablemente no cae en la categoría de "bucle manualmente" ....

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