2009-09-10 10 views
6

Znalazłem this solution dla niewrażliwego na wielkość rozróżniacza jQuery :contains na StackOverflow. Działa świetnie, ale kosztem wydajności. Czy ktokolwiek inny uważa to rozwiązanie za nieco powolne?Czy istnieje sposób na przyspieszenie tego rozwiązania w przypadku niewrażliwego na wielkość znaków jQuery: zawiera selektor?

Używam selektora :contains do przeszukiwania tabeli. Użytkownik wpisuje ciąg do pola tekstowego. Dla każdego klawisza przeszukuje tabelę dla tego ciągu, pokazując tylko wiersze, które zawierają ten ciąg, za pomocą selektora :contains. Przed wdrożeniem rozwiązania niewrażliwego na wielkość, wyszukiwanie było szybkie i szybkie. Teraz za pomocą tego rozwiązania blokuje się na krótką chwilę po każdym naciśnięciu klawisza.

Jakieś pomysły na to, jak można przyspieszyć to rozwiązanie?

Odpowiedz

10

znalazłem inne rozwiązanie szukania bez uwzględniania wielkości liter w Google (patrz Eric Phan), który różni się nieznacznie od tego, z którego początkowo korzystałem.

oryginalny:

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

EricPhan:

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

Porównując dwa, można zobaczyć rozwiązanie Erica Phan dostęp DOM atrybutów bezpośrednio i wykorzystuje toLowerCase() zamiast toUpperCase(). Ta ostatnia nie ma znaczenia, ale ta pierwsza poprawiła wydajność wyszukiwania niewrażliwego na wielkość liter. Po prostu zmiana oryginalnego rozwiązania na użytek (a.textContent || a.innerText || "") zamiast jQuery(a).text() zrobiła różnicę!

Teraz jestem trochę ciekawy, więc poniżej pojawia się pytanie: co to za umowa z jQuery.text()? Dlaczego jest tak wolno? Mam swoje założenia, ale chciałbym usłyszeć, co mówią eksperci.

Wreszcie dzięki wszystkim, którzy odpowiedzieli. Doceniam twoją pomoc. =)

+0

To jest niesamowicie stary post i prawdopodobnie nie odnosi się do rzeczywistości, ale gdybym musiał wyciągnąć mój wehikuł czasu. Zgaduję, że wywołanie jquery na tym konkretnym danych/DOM spowodowało wyjątek javascript, który jquery obsługiwał wewnętrznie. Podczas gdy twoja zmiana na wieloetapowy czek prawdopodobnie zwarła, zamiast podnieść wyjątek, który musiał zostać złapany. –

1

możesz spróbować nie sprawdzać po każdym naciśnięciu klawisza, ale być może sekundę po naciśnięciu ostatniego klawisza. w ten sposób nie będziesz ciągle sprawdzać, kiedy użytkownik pisze, ale raczej sprawdza, kiedy użytkownik skończy, lub wstrzymuje pisanie.

0

Aby dodać do tego, co powiedział jason, możesz spróbować użyć tej funkcji, aby uzyskać this plugin.

6

Możesz spróbować sprawdzić selektor tylko raz, po tym, jak użytkownik przestał pisać przez określony czas, nie dla każdego naciśnięcia klawisza.

Na przykład, prosta implementacja:

Zastosowanie:

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

Realizacja:

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

Dzięki CMS! Podobało mi się to rozwiązanie bardzo; proste i skuteczne. Jednak po ostatnim naciśnięciu klawisza było jeszcze dłuższe niż określone opóźnienie. Znowu zacząłem szukać w Google i znalazłem inną wersję * nieczułego * wyszukiwania, które faktycznie pasuje do wydajności domyślnego * wyszukiwania * * (zobacz moją odpowiedź poniżej). Niemniej jednak utrzymuję twoje rozwiązanie w mojej tylnej kieszeni. Zdecydowanie potrzebuję czegoś takiego później. =) – John

1

tutaj jest kontynuacją pytanie: Co umowa z jQuery.text()? Dlaczego tak wolno? tak wolno?

Podejrzewam, że to ze względu na powolny $(a) (konwersja elementu DOM do obiektu jQuery), a nie .text().

Powiązane problemy