Scroll-locker - zapamiętywanie pozycji na stronie

w dziale Aplikacje dla Opery
daroc napisał(a):

W ostatnich dniach napisałem skrypt, który powoduje, że pozycja pionowego paska przewijania jest zapamiętywana przy prześciach pomiędzy stronami, dzięki czemu łatwiej oglądać na przykład galerie, w których nad zdjęciem jest wysoki nagłówek lub jakieś menu.

Skrypt umożliwia automatyczne zapamiętywanie pozycji scrolla co np. 0,5 sekundy (w sumie mało praktyczna opcja) oraz zapamiętywanie pozycji po użyciu przycisku (linka).
Skrypt używa cookies do zapamiętywania pozycji. Cookies wygasa po 30 dniach, więc po ponownym wejściu na stronę znowu mamy scrolla na ostatnio zachowanej pozycji.
Linki pojawiają się w prawym górnym rogu. Pojedyncze kliknięcie zachowuje pozycję, podwójne resetuje (gdybyśmy już nie chcieli przywracania pozycji scrolla). Znajduje się tam również przycisk, którym można ukryć na danej stronie linki, w razie gdyby coś przysłaniały.

Mam nadzieję, że się komuś przyda.
Czekam na komentarze i propozycje.
Na razie na liście todo mam dodanie możliwości wyłączenia scroll-lockera dla całej domeny. W tej chwili jeśli nie chcemy okienka w prawym górnym rogu należy posłużyć się preferencjami dla witryny.

scroll-locker.js

daroc napisał(a):

Widzę niewielkie zainteresowanie. wink
To może chociaż mógłbym kogoś poprosić o krótki test tego skryptu, abym wiedział, czy działa popranie?
Z góry mówię, że nie działa np. na Onecie, gdy klika się na linki prowadzące do różnych subdomen, np. pozycja zapamiętana na sport.onet.pl nie będzie działała na wiadomosci.onet.pl, ale i tak na onecie akurat mało się przydaje ten skrypt (no chyba że trafimy na jakąś galerię). Potestować można na przykład tutaj. Jeśli ktoś używa wysokiej rozdzielczości, to można sobie zmniejszyć rozmiar okna na chwilę, żeby zobaczyć jak to funkcjonuje.

szyk napisał(a):

Działa, i na tym forum, i na Onecie. smile

Edycja: jednak nie do końca dobrze, ustawienie na jednej stronie na tym forum jest zapamiętane na innych stronach na tym forum. smile

daroc napisał(a):

Zgadza się, zapamiętywana jest pozycja dla wszystkich stron w danej domenie. Masz inny pomysł na zapamiętywanie? Wiele stron ma adresy typu strona.pl/artykuły/id_artykułu, więc różne adresy w obrębie domeny muszą mieć wspólną pamieć.

Edit: Więcej informacji na temat skryptu (jak używać itd) umieściłem na moim blogu. wink

szyk napisał(a):

Originally posted by daroc:

Zgadza się, zapamiętywana jest pozycja dla wszystkich stron w danej domenie.


Nie doczytałem w pierwszym poście, to ma sens. wink

Nie lepiej by było, żeby ten pasek w prawym górnym rogu był włączany na żądanie (chociażby żeby opcjonalnie była taka możliwość, poprzez przycisk-skryptozakładkę)? Trochę denerwujące jest jego domyślne oglądanie na wszystkich stronach. smile

daroc napisał(a):

W tej chwili jest możliwość ukrycia menu i wyłączenia całego skryptu dla danej domeny. Chociaż może faktycznie włączanie na żądanie byłoby ciekawszym rozwiązaniem - pewnie stron, na których taki scroll-locker się przeydaje jest mniej niż tych pozostałych. bigsmile
Kto inny zasugerował mi, żeby w rogu był tylko iks, a długi link pojawiał się dopiero po najechaniu.
Ale na chwilę obecną Twój pomysł podoba mnie się bardziej. I nawet chyba będzie sporo łatwiejszy w wykonaniu. wink

daroc napisał(a):

Proszę jakąś mądrą głowę o pomoc w stworzeniu buttona. Button poniżej oprócz uruchamiania tego skryptu powinien jeszcze odświeżyć widok, tzn. zrobić Refresh display (nie chodzi o odświeżanie w JavaScript czy przeładowywanie stron, tylko o odświeżenie z cache). Przy (mojej) próbie dodania odświeżania strona się tylko odświeża, a cookie się już nie dodaje.

Button15, "SL"="Go to page, "javascript:void(eval('t=new Date(); t.setTime(t.getTime()+60*60*24*7); document.cookie=\'scroll-locker-mode=0;expires=\'+t.toGMTString()+\'; path=/\''))", 1, "SL", "Mail Newsgroups""


Chciałem zrobić ikonkę kłódki, ale chyba domyślnie w skórce nie ma "handle" do ikonek kłódek? No i żeby się potem komuś nie myliło z szyfrowanym połączeniem..

daroc napisał(a):

Nie da się czy nikt nie chce zdradzić jak to się robi? wink

szyk napisał(a):

Originally posted by daroc:

Nie da się czy nikt nie chce zdradzić jak to się robi? wink


Hmm, a potrzebujesz pomocy javaskryptowca czy konstruktora przycisków? wink
Przycisk ma działać z nowszą wersją skryptu niż zamieszczona?

daroc napisał(a):

Konstruktora przycisków. wink

Dwa posty wyżej jest przycisk, który dodaje cookie. Nie korzysta w ogóle ze skryptu, skrypt działa niezależnie - po prostu sprawdza czy dane ciastko istnieje. Chodzi o modyfikację przycisku tak żeby po dodaniu cookie jeszcze odświeżył stronę (aby skrypt został uruchomiony od razu).
To znaczy jeśli uda się stworzyć przycisk, który po włączeniu utworzy ciastko "scroll-locker-mode=0" oraz odświeży stronę z cache (można to przecież przetestować na dowolnym serwerze), to proszę o wrzucenie tutaj.

(Chwila przemyśleń wink ):
Chociaż teraz zastanawiam się trochę nad sensem takiego rozwiązania. W następnej wersji spróbuję przerobić skrypt w ten sposób, aby możliwe było uruchomienie go bez przeładowywania strony. Wcześniej zrezygnowałem z tego z powodu takiego, że jeśli w przypadku gdy cookie nie jest ustawione, skrypt po prostu nie zostaje uruchomiony, menu nie jest dodawane, nie są tworzone jakieś dodatkowe funkcje, przez co teoretycznie strony, na których nie korzystamy ze skryptu, będą działały ciut szybciej. Ale wada taka że do uruchomienia skryptu potrzebne jest odświeżenie strony (co nie jest jakimś dużym problemem, dopóki nie jesteśmy na stronie opartej na ramkach).

Edit:
Czyli chodzi o zrobienie zwykłego przycisku, tyle że z nietypową (?) akcją "go to page, javacript: ..." plus druga akcja.

szyk napisał(a):

Originally posted by daroc:

Chodzi o modyfikację przycisku tak żeby po dodaniu cookie jeszcze odświeżył stronę (aby skrypt został uruchomiony od razu).



Originally posted by daroc:

Button poniżej oprócz uruchamiania tego skryptu powinien jeszcze odświeżyć widok, tzn. zrobić Refresh display


Hmm, to ja już nie do końca rozumiem, dodałeś do kodu przycisku operowe polecenie "& Refresh display" i nie działa to tak, jak powinno, czy nie dodawałeś tego polecenia? bigsmile

daroc napisał(a):

bigsmile
Więc jeszcze raz.
Powyżej jest przycisk który tylko dodaje cookie (bo tylko takie polecenie w sobie zawiera). Proszę o zrobienie przycisku, który oprócz dodania tego cookie jeszcze odświeży widok z cache.
Próbowałem dodać do powyższego przycisku refresh display, ale wtedy widok się odświeżał, ale cookie nie było dodawane. Może po prostu dodawałem to polecenie w jakiś nieudolny sposób. wink A być może trzeba to zrobić w ogóle w inny sposób, dlatego jeśli ktoś potrafi osiągnąć ten sam efekt w inny sposób (dodanie cookie + refresh display), to przycisk może mieć zupełnie inną konstrukcję, ważne żeby wykonywał te dwie akcje i żeby dało się ustawić własną ikonkę jakby ktoś korzystający ze skryptu tak właśnie chciał.
Próbowałem też użyć button makera z wiki, ale przy tak skomplikowanym parametrze go to page coś się chyba psuło.

adas napisał(a):

A ja mam taką prośbę: aby dało się wyłączyć pokazywanie tego skryptu w iframe. Bo teraz go mam w każdej reklamie google, czy też innej ramce. wink

szyk napisał(a):

Originally posted by daroc:

Więc jeszcze raz.


Trzeba było tak od razu. p
Dodaj opóźnienie przed "Refresh display", np. "... & Delay, 500 & Refresh display". smile

Originally posted by daroc:

żeby dało się ustawić własną ikonkę jakby ktoś korzystający ze skryptu tak właśnie chciał.


Jak są "&" w kodzie przycisku, które oddzielają poszczególne polecenia, to ikonka powina być przypisana do pierwszego polecenia: button .

Originally posted by daroc:

Próbowałem też użyć button makera z wiki, ale przy tak skomplikowanym parametrze go to page coś się chyba psuło.


Nie wiem, którego próbowałeś, ale ja używam tego od CrazyTerabytesa: http://operawiki.info/CustomButtons#creating . smile

Originally posted by adas:

A ja mam taką prośbę: aby dało się wyłączyć pokazywanie tego skryptu w iframe


+1 wink

adas napisał(a):

No i może jakieś polskie tłumaczenie? wink Nie żebym nie rozumiał, ale chyba się da prosto? wink

Edit: No i problem znalazłem: powinno chyba olewać #kotwice? Bo teraz na tym forum klikając na permalinka przechodzę do posta a zaraz potem na położenie zapisane przez skrypt. A kotwica akurat ważniejsza by była...
Chyba jednak działa prawidłowo... Dziwne wink

Edit2:

Originally posted by daroc:

Kto inny zasugerował mi, żeby w rogu był tylko iks, a długi link pojawiał się dopiero po najechaniu.
Ale na chwilę obecną Twój pomysł podoba mnie się bardziej. I nawet chyba będzie sporo łatwiejszy w wykonaniu.


A w Autosizerze jest coś takiego, że wystarczy myszką dojechać do do prawego-górnego rogu ekranu i tam wtedy pojawia się menu. http://userjs.org/scripts/browser/enhancements/autosizer

Może tak by było lepiej?

Edit3: A dałoby się tak zrobić aby skrypt przewijał stronę przed jej całkowitym załadowaniem? Może jest taka możliwość?
No i wpis: http://adas.jogger.pl/2008/07/04/userjs-scroll-locker/

daroc napisał(a):

Originally posted by adas:

A ja mam taką prośbę: aby dało się wyłączyć pokazywanie tego skryptu w iframe. Bo teraz go mam w każdej reklamie google, czy też innej ramce.


Tzn opcja miałaby być w pliku skryptu, żeby w ogóle wyłączyć skrypt dla pływających ramek? A jeśli jakaś strona ma taką dużą pływającą ramkę, w której jest cała treść?

Originally posted by szyk:

Dodaj opóźnienie przed "Refresh display", np. "... & Delay, 500 & Refresh display".


Dzięki, spróbuję po powrocie z wakacji. Dlaczego trzeba stosować to delay? Zauważyłem, że wiele przycisków musi z niego korzystać, aby kilka funkcji wykonywało się po kolei w prawidłowy sposób. Jest na to jakieś wyjaśnienie? Czy po prostu "tak działa i już"?

Originally posted by szyk:

Nie wiem, którego próbowałeś, ale ja używam tego od CrazyTerabytesa


Dokładnie tego: ScipioNeer's Button Creating Tool, wydawał mi się przyjemniejszy w obsłudze. wink

Originally posted by adas:

No i może jakieś polskie tłumaczenie? Nie żebym nie rozumiał, ale chyba się da prosto?


Polskie tłumaczenie jest na blogu, więc mogę przerzucić do skryptu, tylko że tego wtedy dużo będzie.

Originally posted by adas:

Edit3: A dałoby się tak zrobić aby skrypt przewijał stronę przed jej całkowitym załadowaniem? Może jest taka możliwość?


Będzie trudno, bo skąd mam wiedzieć, czy załadowana została wystarczająca część dokumentu, aby przewinąć na wybraną pozycję?


Co do linka do skryptu jeszcze. Jak piszę na forum, pliki wysyłane są do katalogu files/, zaś na blogu - do blog/
Jak sobie najlepiej poradzić z aktualizacją tego skryptu tak aby nie było jakichś pomyłek i żeby pobierana była zawsze aktualna wersja? Poprzez accound -> files mogę wykasować plik i wgrać nowy. Tylko pytanie którego adresu pliku się trzymać? wink

szyk napisał(a):

Originally posted by daroc:

Dlaczego trzeba stosować to delay? Zauważyłem, że wiele przycisków musi z niego korzystać, aby kilka funkcji wykonywało się po kolei w prawidłowy sposób. Jest na to jakieś wyjaśnienie? Czy po prostu "tak działa i już"?


Widocznie polecenia wykonywały się nie jedno po drugim, ale mniej więcej równocześnie, i dlatego Opera zachowywała się nie tak, jak powinna. Generalnie jak coś nie działa przy skomplikowanych przyciskach, to warto sprawdzić ich działanie po zastosowaniu "delay".

Originally posted by daroc:

Tylko pytanie którego adresu pliku się trzymać? wink


Jednego. p
Może być też inny katalog: http://my.opera.com/daroc/files/ . smile

daroc napisał(a):

Originally posted by adas:

Edit3: A dałoby się tak zrobić aby skrypt przewijał stronę przed jej całkowitym załadowaniem? Może jest taka możliwość?


Teraz jest tak, że przewinięcie następuje po załadowaniu całego dokumentu (obrazki nei muszą zostać załadowane) i już teraz czasami pojawia się problem przy przeglądaniu galerii, bo dokument się załaduje, a nieznany jest jeszcze rozmiar obrazu, przez co przeskoczenie do odpowiedniej pozycji scrolla nie następuje.

Originally posted by adas:

A ja mam taką prośbę: aby dało się wyłączyć pokazywanie tego skryptu w iframe. Bo teraz go mam w każdej reklamie google, czy też innej ramce.


Postaram się zrealizować. Chociaż nie wiem czy wystarczy samo sprawdzanie czy to jest ramka, bo przecież są strony, gdzie cała zawartość jest w ramce. Chyba że by na przykład sprawdzać czy szerokość i wysokość strony (ramki) przekracza dajmy na to 200px?

daroc napisał(a):

Originally posted by adas:

A ja mam taką prośbę: aby dało się wyłączyć pokazywanie tego skryptu w iframe. Bo teraz go mam w każdej reklamie google, czy też innej ramce. <img src=" width="17" height="17">


No i nadszedł ten czas, że miałem trochę czasu na poprawienie tego. wink Skrypt będzie działał tylko w ramkach i oknach większych niż 250x100 pikseli (da się zmienić w konfiguracji).
Nie powinno być już problemu przy przywracaniu okien z kosza oraz przy używaniu przycisku wstecz z History Navigation Mode ustawionym na 1.