2009-09-10 9 views
6

ho trovato this solution per un selettore case-insensitive jQuery :contains su StackOverflow. Funziona alla grande, ma a discapito delle prestazioni. Qualcun altro trova questa soluzione un po 'lenta?C'è un modo per velocizzare questa soluzione per un jQuery insensibile alle maiuscole: contiene un selettore?

sto usando il selettore :contains per cercare un tavolo. L'utente digita una stringa di ricerca in una casella di testo. Per ogni sequenza di tasti, cerca nella tabella quella stringa, mostrando solo le righe che contengono quella stringa tramite il selettore :contains. Prima di implementare la soluzione senza distinzione tra maiuscole e minuscole, questa ricerca era veloce e scattante. Ora con questa soluzione, si blocca per un breve momento dopo ogni sequenza di tasti.

Tutte le idee su come questa soluzione possa essere accelerato?

risposta

10

ho trovato un'altra soluzione della ricerca case-insensitive su Google (vedi Eric Phan), che varia leggermente da quello che stavo usando originariamente.

originale:

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

EricPhan:

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

Confrontando i due, si può vedere la soluzione di Eric Phan accede al DOM attribuisce direttamente e usa toLowerCase() invece di toUpperCase(). Quest'ultimo non ha molta importanza, ma il primo è ciò che ha davvero migliorato le prestazioni della ricerca insensibile alle maiuscole e minuscole. Cambiare solo la soluzione originale per usare (a.textContent || a.innerText || "") invece di jQuery(a).text() ha fatto la differenza!

Ora sono un po 'curioso, quindi ecco una domanda successiva: Qual è l'affare con jQuery.text()? Perché è così lento? Ho le mie supposizioni, ma mi piacerebbe sapere cosa hanno da dire gli esperti.

Infine, grazie a tutti coloro che hanno risposto. Apprezzo il tuo aiuto. =)

+0

Questo è un post incredibilmente vecchio e probabilmente non pertinente alla realtà, ma se dovessi ritirare la mia macchina del tempo. La mia ipotesi sta invocando jquery su quel dato specifico/DOM ha provocato un'eccezione javascript che jquery ha gestito internamente. Considerando che il tuo passaggio al controllo a più zampe probabilmente si è verificato in corto circuito invece di sollevare un'eccezione che era necessaria. –

1

Si potrebbe provare a non controllare dopo ogni sequenza di tasti, ma forse un secondo dopo aver premuto l'ultimo tasto. in questo modo non stai controllando costantemente mentre l'utente sta digitando, ma piuttosto controllando quando l'utente ha terminato o interrompendo la digitazione.

0

Per aggiungere a ciò che Jason ha detto, è possibile provare a utilizzare this plugin per farlo.

6

Si potrebbe provare a controllare il selettore solo una volta, dopo che l'utente ha smesso di digitare per un determinato periodo di tempo, non per ogni sequenza di tasti.

Per esempio, una semplice implementazione:

Usage:

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

Implementazione:

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

Grazie CMS! Mi è piaciuta molto questa soluzione; semplice ed efficace Tuttavia, c'era ancora un ritardo più lungo di quello specificato dopo il mio ultimo tasto. Ho dato un'altra occhiata a Google e ho trovato una versione diversa della ricerca case- * insensitive * che corrisponde effettivamente alle prestazioni della ricerca case- * sensitive * predefinita (vedi la mia risposta sotto). Tuttavia, sto mantenendo la tua soluzione nella mia tasca posteriore. Avrò assolutamente bisogno di qualcosa di simile più tardi. =) – John

1

ecco una domanda successiva: che cos'è l'accordo con jQuery.text()? Perché è così lento ?

Ho il sospetto che è lento a causa del $(a) (convertendo l'elemento DOM a un oggetto jQuery) e non il .text().

Problemi correlati