2009-09-10 8 views
6

Encontré this solution para un selector jQuery :contains insensible a mayúsculas y minúsculas en StackOverflow. Funciona muy bien, sin embargo, tiene un costo de rendimiento. ¿Alguien más encuentra que esta solución es un poco lenta?¿Hay alguna manera de acelerar esta solución para una jQuery insensible a mayúsculas y minúsculas: contiene un selector?

Estoy usando el selector :contains para buscar en una tabla. El usuario escribe una cadena de búsqueda en un cuadro de texto. Para cada pulsación de tecla, busca en la tabla esa cadena, mostrando solo las filas que contienen esa cadena a través del selector :contains. Antes de implementar la solución insensible a mayúsculas y minúsculas, esta búsqueda fue rápida y ágil. Ahora con esta solución, se bloquea por un breve momento después de cada pulsación de tecla.

¿Alguna idea sobre cómo se puede acelerar esta solución?

Respuesta

10

he encontrado otra solución de la búsqueda sensible a las mayúsculas en Google (ver Eric Phan), que varía ligeramente de la que estaba usando originalmente.

original:

return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0; 

EricPhan:

return (a.textContent || a.innerText || "").toLowerCase().indexOf(m[3].toLowerCase())>=0; 

Comparando los dos, se puede ver la solución de Eric Phan accede al DOM atribuye directamente y utiliza toLowerCase() en lugar de toUpperCase(). Esto último realmente no importa, pero el primero es lo que realmente mejoró el rendimiento de la búsqueda insensible a mayúsculas y minúsculas. ¡Solo cambiar la solución original para usar (a.textContent || a.innerText || "") en lugar de jQuery(a).text() hizo toda la diferencia!

Ahora estoy un poco curioso, así que aquí hay una pregunta de seguimiento: ¿Cuál es el trato con jQuery.text()? ¿Por qué es tan lento? Tengo mis suposiciones, pero me encantaría escuchar lo que los expertos tienen que decir.

Por último, gracias a todos los que respondieron. Aprecio tu ayuda. =)

+0

Esta es una publicación increíblemente antigua y probablemente no es relevante para la realidad en absoluto, pero si tuviera que sacar mi máquina del tiempo. Mi suposición es que invocar jquery en ese DOM/datos específicos resultó en una excepción javascript que jquery maneja internamente. Mientras que su cambio a la verificación de múltiples patas probablemente se cortocircuitó en lugar de presentar una excepción que se debe capturar. –

1

podría intentar no verificar después de cada pulsación de tecla, pero tal vez un segundo después de presionar la última tecla. de esta forma, no se está comprobando constantemente mientras el usuario está escribiendo, sino más bien verificando cuando el usuario finaliza o hace una pausa al escribir.

0

Para agregar a lo que ha dicho Jason, puede intentar usar this plugin para lograr eso.

6

Puede intentar consultar el selector solo una vez, después de que el usuario haya dejado de escribir durante un tiempo determinado, no para cada pulsación de tecla.

Por ejemplo, una implementación sencilla:

Uso:

$("#textboxId").keyup(function() { 
    typewatch(function() { 
    // executed only 500 ms after the user stopped typing. 
    }, 500); 

Implementación:

var typewatch = function(){ 
    var timer = 0; // store the timer id 
    return function(callback, ms){ 
     clearTimeout (timer); // if the function is called before the timeout 
     timer = setTimeout(callback, ms); // clear the timer and start it over 
    } 
}(); 
+0

Gracias CMS! Me gustó mucho esta solución; simple y efectivo Sin embargo, aún hubo un retraso mayor que el especificado después de mi última pulsación de tecla. Eché otro vistazo a Google y encontré una versión diferente de la búsqueda case * insensible * que realmente coincide con el rendimiento de la búsqueda por defecto * sensible a mayúsculas y minúsculas (ver mi respuesta a continuación). Sin embargo, mantengo tu solución en mi bolsillo trasero. Definitivamente necesitaré algo así más adelante. =) – John

1

aquí hay una pregunta de seguimiento: ¿Cuál es el trato con jQuery.text()? ¿Por qué es tan lento?

sospecho que es lento debido a la $(a) (convirtiendo el elemento DOM a un objeto jQuery) y no el .text().

Cuestiones relacionadas