Autocompletery
W życiu każdego przychodzi kiedyś taki moment, że trzeba zrobić coś wbrew sobie. Na przykład skodować coś w JS. Pocieszeniem, może być fakt, iż zawsze gorzej może być — jest jeszcze flash. A fu!
Zmagania z autocomplete do formularzy zostały rozpoczęte.
Wymagania:
- musi działać bez patchowania bibliotek, frameworków i okolic
- musi mieć możliwość wysłania requesta z co najmniej dwoma parametrami (np. szukany ciąg znaków i ID miasta)
- musi jadać output w JSON’ie
- obsługa parsowania danych zwróconych z serwera musi być dość elastyczna
Pod lupę poszły kolejno: MochiKit, Scriptaculous i Yahoo UI
MochiKit jest spory, ma własny namespace i nie modyfikuje natywnych obiektów więc nie byłoby problemów z dołożeniem do istniejących skryptów. Jest modułowy i ma pokaźną ilość bajerów. Sęk w tym, że na dobrą sprawę jak chcemy czegoś użyć to okazuje się, że ma takie zależności, iż wszystkie moduły i tak zostaną zaimportowane. I jak się okazuje nie posiada w oficjalnej paczce autocomplete. Jedynie na ich wiki jest port skryptu ze Scriptaculous. Port, portem, a bugi, bugami. Użyć tego się nie dało bez wnikania w kod i dochodzenia się warum działać nie chce. Inna wada, to to, że jest to port czegoś co poszło jako następne pod lupę.
Scriptaculous, do działania wymaga dodatkowo prototype, więc też już się tego robi sporo. Autocomplete jest, jednak…. nie znalazłem nigdzie opcji, aby przekazać 2 parametry do serwera. Samo to, wystarczyło, aby skreślić Scriptaculous z listy. Oliwy do ognia dodał fakt, iż ten autocomplete oczekiwał, że dostanie ode mnie zwykłą html’ową listę. Może jeszcze tosty z serem i oregano dla smaku?
Zostało do zbadania Yahoo. Trzeba przyznać, że dokumentację mają całkiem sensowną. Plus dla nich za to. Yahoo ma swój namespace, a ponad to nie modyfikuje (ponoć) obiektów JS’owych, czyli kwalifikuje się do użycia w projekcie, gdzie jakieś skrypty wykorzystujące inne frameworki już są. Ichnie autocomplete potrafi wysłać w zasadzie dowolną ilość parametrów. Sęk w tym, że nie potrafi tego dokonać metodą POST. Pierwszy parametr wyciągnięty z elementu o podanym ID poleci GET’em jako “query”. O kolejne musimy sami się zatroszczyć i przekazać je do odpowiedniej metody w obiekcie requestu ajaxowego. Kolejnym plusem i to nawet całkiem sporym jest sposób w jaki obsługuje zwracane dane w JSON’ie. Na dobrą sprawę Autocomplete od Yahoo powinien móc obsłużyć dowolnie zamotane struktury.. Ponad to, daje możliwość w całkiem przyjemny sposób dać coś a’la google suggest, czyli np. przy każdej pozycji liczbę wyników, osób będących w jakimś mieście — cokolwiek co zechcemy.. ;)




Comments