Postanowiłem nieco rozszerzyć ostatni wątek o pomysł, który ostatnio mnie nawiedził. Nadaje się on głównie dla osób, które są zainteresowane grzebaniem w kodzie swoich serwisów. I tutaj, na Joggerze na pewno nie jest ich mało.
Wszystkie modele opisane w poprzednim wpisie są modelami czysto generycznymi, w żaden sposób nie łączą się z akcjami użytkownika. Oczywiście, można to zmienić!
Dwie idee połączenia akcji użytkownika wraz z reakcją strony, które wpadły mi do głowy są względnie proste do zaimplementowania a mogę wnieść wiele do poszczególnych rodzajów oprogramowania.
Idea 1: Pierwsza nieodwiedzona strona.
Jedna z najprostszych idei, które mogą być bardzo pomocne w tworzeniu specjalizowanej listy linków dla użytkownika. Załóżmy, że istnieje lista stron od 1 do n. Gdzieś pomiędzy nimi znajduje się strona m, którą aktualnie odwiedza użytkownik. Użytkownik przechodzi następnie na stronę o. Wykonujemy następujące sprawdzenie:
- Jeśli o < m, podajemy linka do m + 1 jako pierwszej nieodwiedzonej strony.
-
Jeśli o > m, m = o.
- Jeśli chcemy być jeszcze bardziej poprawni, możemy sprawdzić, czy o > m + 1. Jeśli tak, możemy poinformować użytkownika, że pominął przy przeglądaniu odpowiednią ilość stron i zapytać, czy chce, abyśmy oznaczyli je za nieprzeczytane.
- Uwaga – domyślnie oznaczamy je za przeczytane, bo jeśli ktoś już
przeskakuje ileś stron, musi mieć ku temu powód!
Plusem tego rozwiązania jest to, że jeśli chcemy, da się je zaimplementować nawet w JavaScripcie, o ile dostarczymy mu numer aktualnej strony.
Zyskują na tym wielce fora, bo dostęp do wątków jest znacznie uproszczony. Nie jestem ich bywalcem, ale z tego, co wiem, w większości z nich stosowane są od dawna podobne mechanizmy. Jak bardzo pokrywają się z moim pomysłem – tego już nie powiem. 🙂
Problemy pojawiają się w przypadku stron, w których publikacje pojawiają się od najnowszej do najstarszej. W takim przypadku stosowanie powyższej idei mija się z celem – nieprzeczytana treść znaleźć się może nie tylko po jednej, ale po obu stronach listy.
Idea 2: Pozwól użytkownikowi zaznaczyć miejsce, do którego chciałby wrócić
Ta koncepcja jest jeszcze lepsza. W miejscach, gdzie różne wartościowe treści są rozrzucone wśród masy tych nieużytecznych, a jest ich stanowczo za dużo, aby bookmarkować je gdzieś w zewnętrznym serwisie, sami możemy postarać się o to, by zapewnić odpowiednią wygodę czytającym.
Jak? Na każdej ze stron dajemy dodatkowy przycisk, odpowiadający za akcję zapisania. Gdy przeglądamy listę stron, wszystkie zapisane strony z tej listy ukazują się jako linki. Jeśli założymy, że lista stron nie jest zbyt długa, aby mieć więcej niż kilka takich zakładek, użytkownik nie będzie potrzebował ich opisywania. Ale zamiast opisywania, skłaniam się ku innej formie. Niech zakładki mają kilka kolorów do wyboru.
Co dalej? Użytkownik może dostać własną stronę z zakładkami, jakie zrobił i małym wyjaśnieniem kontekstu (chciażby nazwa listy stron, w której dane zakładki się znajdują).
Kwestią sporną jest to, co powinno dziać się z taką zakładką po powróceniu na jej stronę. Przyzwyczajeni jesteśmy do manualnego usuwania wszelkich zakładek w przeglądarkach i specjalizowanych serwisach. Z drugiej strony logika podpowiada, że gdy ktoś wrócił na tą stronę, to w konkretnym celu i nie powinniśmy go zmuszać do dodatkowego klikania, tylko po to, by usunął tą zakładkę. Tą rzecz pozostawiam do przemyślenia ewentualnym implementatorom, specom od usability wyższej klasy ode mnie i wszystkim czytającym. 😉
Pomysł jest stary, jak stare są zakładki do książek. Ale chyba nikt jeszcze czegoś takiego sam z siebie nie zaimplementował w sieci. Głównym problemem tego rozwiązania jest z kolei bardzo łatwa możliwość zniszczenia całej jego używalności, jeśli tylko nie postaramy się utrzymać tego tak prostym, jak tylko można.
Mam nadzieję, że skłoniłem Cię do własnych refleksji. 🙂
O podobnych zakładkach kiedyś sam myślałem. Ale nic specjalnie ciekawego mi do głowy nie przyszło.
Tak sobie myślę, że pomsył numer 2 można by fajnie zaimplementować przy użyciu Google gears i Greasemonkey
Oznaczanie pominiętych stron jako odwiedzonych nie zawsze jest dobrym pomysłem. Zastanów się nad przypadkiem forum bez wyszukiwarki, gdzie chcesz znaleźć konkretny wpis, ale nie pamiętasz, na której z kilkudziesięciu podstron go widziałeś. Jeśli wiesz, ile jest stron, i jeśli masz możliwość przejścia do dowolnej, to przeglądasz strony zgodnie z algorytmem bisekcji. Ale jeśli nie, to pewnie skaczesz co tyle stron, na ile pozwala Ci pasek enumeratora. Jeśli forum będzie zaznaczać wszystkie pominięte jako przeczytane, zgubisz się już po chwili.
Poza tym oznaczenie strony jako przeczytanej działa i tak tylko tak długo, jak długo strona jest przechowywana w historii przeglądarki. Gdy wyekspiruje (albo gdy wyczyścisz historię, a gdy strona jest tworzona dynamicznie albo pobierana przez https – to od razu), z powrotem jest oznaczona jako nieprzeczytana.
Dlatego lepszy jest mechanizm, w którym forum zapisuje w cookie albo w profilu użytkownika ostatnio przeczytaną stronę albo ostatni przeczytany wpis i przy następnej wizycie przenosi Cię do pierwszej nieczytanej strony/wpisu.
Strasznie komplikujesz tak prostą rzecz jak stronicowanie.
Wydaje mi się, że wystarczą 3 elementy, dla intuicyjnej nawigacji przez strony:
1. link „< poprzednia strona”
2. link „nastepna strona >”
3. rozwijana lista z wypisanymi stronami. Ewentualnie można dodać krótki tekst opisujący co dana strona zawiera.
Invision Power Board bardzo ciekawie i mądrze ten problem rozwiązuje:
http://img464.imageshack.us/img464/5636/screenshot3ow6.png
Godryk
Co do historii przeglądarki – mówiąc o JavaScript miałem na myśli właśnie ciacho. 🙂
Zaintrygowało mnie to zarazem do przemyśleń, czy (i gdzie) sprawdziłaby się forma Undo/Redo. Na pewno w aplikacjach web, gdzie jeszcze?
Co do Twojego pomysłu – mógłbyś podać więcej szczegółów, czym konkretnie się różni Twój pomysł od mojego? Mam wrażenie, że są dość podobne.
Speedy
Z tym trzecim się nie zgodzę, lista linków do kilku następnych/poprzednich stron według mnie nie jest wygodna w użyciu, szczerze mówiąc wolę już suwak.
Za to możliwość wpisania numeru strony jest bardzo fajnym pomysłem. Szkoda tylko, że nie wszędzie używanym. 🙂
To nie jest mój pomysł. 🙂 Streściłem rozwiązanie stosowane w IPB (tak, to samo IPB, o którym wspomniał Speedy). Tam masz właśnie po pierwsze, normalny pasek enumeratora stron (pierwsza, poprzednia, po jednej czy dwie obok aktualnej, następna, ostatnia – czyli standardowe rozwiązanie), po drugie, możliwość skoku do dowolnej strony (przycisk javascriptowy), po trzecie, przyciski i linki (chociaż w dość mało intuicyjnych miejscach) umożliwiające skok do pierwszego posta napisanego po Twojej ostatniej wizycie w danym temacie. Ta ostatnia funkcja jest realizowana przez wpis w profilu użytkownika (nie cookie), więc działa niezależnie od tego, z ilu różnych maszyn przeglądasz forum, a ponadto nie wpływa na mechanizm oznaczania przejrzanych stron (inna rzecz, że i tak nie są one oznaczane w żaden widoczny sposób).
Tak naprawdę w tym, co pisałem, chodziło mi o podkreślenie, że oznaczanie pominiętych stron jako przeczytanych może być dla użytkownika niewygodne. I że jeśli już implementować takie skoki, to raczej nie wiązać ich z fałszowaniem historii przegladarki (bo do tego sprowadza się ustawianie visited 😛 ).
Co do pomysłów, to przyszło mi do głowy niewielkie rozwinięcie Twojej idei zakładek: każdy z takich linków można opatrzyć atrybutem title, a w nim zapisać np. moment odwiedzin danej strony (można oczywiście pozwolić użytkownikowi wyedytować tytuł zakładki przy jej tworzeniu i dodać link/przycisk do jej usuwania). BTW, bardzo istotne będzie tworzenie w takim dokumencie kotwic i linkowanie konkretnych jego części (np. postów na forum), a nie strony jako całości (tego w IPB mi bardzo brakuje).
Alternatywnym do zakładek pomysłem mogłaby być możliwość subiektywnej oceny każdej treści: użytkownik mógłby wówczas oznaczyć te, które go zainteresowały (albo tylko zaptaszkować, albo wystawić ocenę w jakiejś skali – gwiazdki, papryczki, whatever), a system podsuwałby mu na życzenie ich listę z dowolnym sortowaniem: alfabetycznym, chronologicznym (w kolejności wpisów lub ocen), tematycznym czy nawet według częstości odwiedzin tekstu przez tego użytkownika lub wszystkich użytkowników.
Wówczas jakiś użytkownik wybiera sobie w danym serwisie pewną ilość perełek, które go zachwyciły (np. ramach Joggera zaznacza kilka tekstów Riddle’a i Twój poprzedni wpis) – i przy następnej wizycie może przywołać listę linków do zaznaczonych tekstów, co znacznie ułatwi mu korzystanie z takiej bazy wiedzy. (Te informacje można przechować w jego profilu czy jako cookie, zajedno – ale informacja w profilu będzie trwalsza). Jednocześnie jego oceny (czy sam fakt zaznaczenia) służą, po zagregowaniu z ocenami wszystkich innych odwiedzających, do ustalenia w miarę obiektywnej oceny wszystkich publikowanych tekstów. W rezultacie otrzymujemy rodzaj wewnętrznego Digga czy del.icio.usa. ;-P Jeśli dodamy możliwość podsuwania użytkownikowi do przejrzenia tekstów, oznaczonych pozytywnie przez innych uzytkowników, którzy poza tym wybierali te same teksty, co on (czyli znane ze sklepów internetowych „klienci, którzy kupili ‘Seks dla opornych’, kupowali również: …”), to mamy w rezultacie zaczątek systemu ułatwiającego samokształcenie w wybranych dziedzinach – a przy okazji weryfikującego teksty (jeśli tekst ma ocenę, zostanie podsunięty do oceny kolejnym osobom). I tak dalej… Co Ty na to? 😉
Natomiast odnośnie Undo/Redo, jestem sceptyczny: nie widziałem jeszcze dobrej implementacji takiego mechanizmu. A raczej nie wyobrażam sobie bardziej zaawansowanego rozwiązania, które byłoby intuicyjne. Jedyne, jakie się przyjęło, to najprostsze – liniowa lista zmian: każda nowa operacja po powrocie do jakiegoś punktu kasuje wszystkie następne (i nie można do nich wrócić, chyba że powtarzając je z pamięci). A tymczasem dużo więcej można by osiągnąć, implementując drzewo zmian – każdy nowy ciąg operacji po powrocie do jakiegoś punktu tworzyłby nową gałąź, bez utraty poprzedniej (jak to ma miejsce przy liniowej liście); gdyby okazało się, że idzie ona w złym kierunku, można by spróbować któregoś z poprzednich podejść lub zacząć kolejne. Ale to ma niewiele wspólnego z enumeracją podstron i zasługuje raczej na nowy wpis… 😉
P.S. Odnośnie samego wygladu enumeratora, bardzo mi się podoba rozwiązanie z eksponencjalnymi przyrostami, które opisałeś poprzednio – chociaż większość użytkowników będzie się bardzo jeżyć przy pierwszym kontakcie. 😉 Jednak to, co pisze Speedy (suwak) zaintrygowało mnie: jak taki suwak miałby wyglądać? Umożliwiać płynne przesuwanie od początku do końca, wyświetlając gdzieś numerek aktualnie wskazanej strony?… To byłoby nieco skomplikowane, ale za to bardzo intuicyjne…
Tfu, mój błąd: suwak to nie to, co opisuje Speedy, tylko to, o czym wspomniałeś w odpowiedzi Speedy’emu. Niemniej, jak mówię, zaintrygowało mnie to – jak to sobie wyobrażasz?