¿Hay una versión insensible a mayúsculas/minúsculas del selector jQuery :contains o debería hacer el trabajo manualmente al recorrer todos los elementos y comparar su .text() con mi cadena?¿Hay un caso jQuery insensible: contiene el selector?
Respuesta
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;
};
});
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. –
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
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 –
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).
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;
};
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.
Creo que quería una función distinta para que tanto ': contains' como': Contains' funcionaran simultáneamente. – joshperry
"el selector: contains permanece sin cambios". –
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
agregar una nueva función es mejor que sobrescribirme, ahora uso esta opción (funciona como un amuleto) –
esto debe agregarse a la biblioteca estándar de jquery – user482594
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).
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;
};
});
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 ...
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
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');
- 1. ¿Hay alguna manera de acelerar esta solución para una jQuery insensible a mayúsculas y minúsculas: contiene un selector?
- 2. Caso insensible find_or_create_by_whatever
- 3. Caso insensible búsqueda variedad
- 4. Doctrine LIKE caso insensible
- 5. jQuery selector: contiene - Usar expresiones regulares
- 6. selector de jQuery contiene signo igual
- 7. selector de jQuery, contiene al igual
- 8. ¿Hay un selector de estilo en jQuery?
- 9. jquery 'atributo contiene' selector con un valor dinámico
- 10. selector jQuery para un elemento que contiene texto directamente?
- 11. caso vim búsqueda insensible sensible reemplazar
- 12. JPA: realizar caso de orden insensible por
- 13. Caso insensible expresión regular Python sin re.compile
- 14. ORACLE 11g caso insensible por defecto
- 15. Caso insensible a la sustitución PowerShell
- 16. Caso insensible ordenamiento especie en NHibernate
- 17. Raíles: ActiveRecord db sort operación caso insensible
- 18. Caso insensible switch de los casos
- 19. Jquery ¿Excluir un selector?
- 20. jQuery selector valor
- 21. LINQ contiene insensible a mayúsculas y minúsculas
- 22. ¿hay un selector de año desplegable de jquery
- 23. ¿Hay algo así como un selector jQuery relativo?
- 24. selector CSS para "foo que contiene barra"?
- 25. Comodín en el selector jQuery
- 26. jQuery selector vacío (selector nulo)
- 27. jquery: selector []?
- 28. jQuery selector personalizado, "indefinido"
- 29. jQuery selector
- 30. ¿Cómo escapas paréntesis en el selector jQuery?
para jQuery 8.1 + marque esta [respuesta] (http://stackoverflow.com/a/2196683/1671639) – Praveen
^Eso es 1.8.1, no 8.1. – TylerH