2009-09-10 2 views
6

Ich fand this solution für eine Groß-und Kleinschreibung jQuery :contains Selector auf StackOverflow. Es funktioniert großartig, jedoch auf Kosten der Leistung. Hat jemand andere diese Lösung als etwas langsam empfunden?Gibt es eine Möglichkeit, diese Lösung für eine Groß-und Kleinschreibung jQuery zu beschleunigen: contains selector?

Ich verwende den :contains Selektor, um eine Tabelle zu suchen. Der Benutzer gibt eine Suchzeichenfolge in ein Textfeld ein. Bei jedem Tastendruck wird die Tabelle nach dieser Zeichenfolge durchsucht, wobei nur die Zeilen angezeigt werden, die diese Zeichenfolge über den Selektor :contains enthalten. Vor der Implementierung der case-insensitive Lösung war diese Suche schnell und bissig. Jetzt mit dieser Lösung, es schließt für einen kurzen Moment nach jedem Tastendruck ab.

Irgendwelche Ideen, wie diese Lösung beschleunigt werden könnte?

Antwort

10

ich eine andere Lösung der Groß- und Kleinschreibung Suche bei Google gefunden (siehe Eric Phan), das unterscheidet sich geringfügig von dem, den ich ursprünglich verwendet habe.

Original:

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

EricPhan:

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

Vergleich der beiden, können Sie Eric Phan-Lösung sehen greift die DOM-Attribute direkt und verwendet toLowerCase() statt toUpperCase(). Letzteres ist nicht wirklich wichtig, aber erstere hat die Leistung der Suche ohne Berücksichtigung der Groß-/Kleinschreibung verbessert. Nur die ursprüngliche Lösung zu ändern, um (a.textContent || a.innerText || "") anstelle von jQuery(a).text() zu verwenden, machte den Unterschied!

Jetzt bin ich ein bisschen neugierig, also hier ist eine Follow-up-Frage: Was ist der Deal mit jQuery.text()? Warum ist es so langsam? Ich habe meine Vermutungen, aber ich würde gerne hören, was die Experten zu sagen haben.

Zuletzt, danke an alle, die geantwortet haben. Ich appreate deine Hilfe. =)

+0

Das ist ein unglaublich alter Beitrag und wahrscheinlich überhaupt nicht realitätstechnisch relevant, aber wenn ich meine Zeitmaschine rausziehen müsste. Meine Schätzung ist, jquery auf diesem spezifischen Daten/DOM anzurufen, resultierte in einer Javascript-Ausnahme, die jquery intern behandelte. Während Ihr Wechsel zum mehrbeinigen Scheck wahrscheinlich kurzgeschlossen wurde, anstatt eine Ausnahme zu ziehen, die gefangen werden musste. –

1

Sie könnten versuchen, nicht nach jedem Tastendruck zu überprüfen, aber vielleicht eine Sekunde nach dem letzten Tastendruck wurde gedrückt. Auf diese Weise überprüfen Sie nicht ständig, während der Benutzer tippt, sondern prüfen, ob der Benutzer fertig ist oder die Eingabe pausiert.

0

Um hinzuzufügen, was Jason gesagt hat, können Sie versuchen, this plugin zu verwenden, um das zu erreichen.

6

Sie könnten versuchen, den Selektor nur einmal zu überprüfen, nachdem der Benutzer die Eingabe für eine bestimmte Zeit beendet hat, nicht für jeden Tastendruck.

Zum Beispiel eine einfache Implementierung:

Verbrauch:

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

Umsetzung:

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

Danke CMS! Ich mochte diese Lösung sehr; einfach und effektiv. Allerdings gab es nach meinem letzten Tastendruck noch eine längere Verzögerung als angegeben. Ich habe einen anderen Blick auf Google geworfen und eine andere Version der case * -Insensitiven Suche gefunden, die tatsächlich mit der Leistung der Standard-case-sensitive-Suche übereinstimmt (siehe meine Antwort unten). Trotzdem halte ich Ihre Lösung in meiner Gesäßtasche. Ich werde definitiv so etwas später brauchen. =) – John

1

hier ist eine Follow-up-Frage: Was ist der Deal mit jQuery.text()? Warum ist es so langsam?

Ich vermute, dass es aufgrund der $(a) (Umwandlung des DOM-Element auf ein jQuery-Objekt) und nicht die .text() langsam ist.