Zablokowanie zamknięcia okna/karty przeglądarki

0

Hejo,

Robię aktualnie projekt w którym będzie się pojawiało dość dużo rekordów, do dodawania rekordów służy specjalny kreator, który prowadzi użytkownika krok po kroku do utworzenia rekordu po kolei dodając do bazy wprowadzane przez usera dane.

Jak wiadomo user bywa większą zmorą niż IE6 i zdarza się że niektóre rekordy pozostają niepełne. Ktoś wyłącza przeglądarkę/zamyka kartę lub klika link do innej strony w czasie pracy z kreatorem. I stąd moje pytanie w jaki sposób wymusić na użytkowniku dokończenie kroków w kreatorze, ewentualnie jak zablokować zamknięcie strony przed ukończeniem kreatora? Korzystam w skrypcie z jQuery także z chęcią wykorzystałbym rozwiązanie w oparciu o niego. Ktoś ma jakieś pomysły?

0

Nie wiem, czy tak można, ale:
Przy wykryciu, że użytkownik nacisnął przycisk "X", otwórz nową kartę z takimi danymi, jakie wprowadził.
Chociaż to byłoby dosyć irytujące...

0

Nie rób tego. Jak ktoś nie chce przebywać już z Twoją stroną, to nie próbuj mu tego uniemożliwić. I tak tego nie przeforsujesz, a tylko człowieka zirytujesz. Myślisz, że jak będziesz blokował zamykanie to chętnie wypełni ankietę? Nie. Zmuszanie jest chamskie, bezsensowne i złe. To nie z użytkownikiem jest coś nie tak, tylko ze zmuszającym.

Co innego ostrzec kogoś, że straci jakieś dane gdy teraz zamknie okno -- być może nieświadomie lub niechcący. Takie potwierdzenia podpina się w JavaScripcie pod zdarzenia window.onbeforeunload/window.onunload etc.

Albo jeszcze lepsze wyjście: sejwuj dane tak często, jak tylko możliwe. Po każdym kroku, czy nawet w trakcie, Ajaxem w tle. Jeśli ktoś wróci, to niech ma już wypełnione. Możesz o tym powiadomić gdzieś na początku kreatora, żeby potem nie było sytuacji, że ktoś wypełni w połowie formularze i sobie pójdzie, a potem do komputera usiądzie druga osoba i zobaczy jakieś osobiste dane tej pierwszej.

0
bswierczynski napisał(a)

Takie potwierdzenia podpina się w JavaScripcie pod zdarzenia window.onbeforeunload/window.onunload etc.

Nie wiem czy to będzie działać, to znaczy miałem takie strony wyświetlające okno modalne komunikatu przy próbie zamknięcia strony, ale gdy przerzuciłem inną zakładke jako aktywną i zamknąłem tamtą, to już nie było tego okna modalnego i zakładka się zamknęła.

0

ja bym się skupił na zapewnienieniu spójności danych, czyli nie zapisywać nic do bazy dopóki user nie skończy pracy z kreatorem-wtedy albo dostajesz pełny rekord, albo żaden.

tak jak wyżej piszą-spotkałem się z okienkiem javascriptowym z potwierdzeniem opuszczenia strony, ale nie widziałem nigdzie blokowania zamknięcia przeglądarki. Takie odbieranie kontroli użytkownikowi powoduje jego irytację i masz gwarantowane, że bardziej świadomy użyje alt+ctr+del, a mniej zresetuje komputer guzikiem.

No chyba, że to biznesowa aplikacja intranetowa, ale wtedy można coś takiego wymusić odgórnie

0

Dane do sesji, a na koniec do bazy. Przy próbie zamknięcia można najwyżej komunikat potwierdzający dać, z informacją że dane zostaną utracone.

0
bswierczynski napisał(a)

Nie rób tego. Jak ktoś nie chce przebywać już z Twoją stroną, to nie próbuj mu tego uniemożliwić. I tak tego nie przeforsujesz, a tylko człowieka zirytujesz. Myślisz, że jak będziesz blokował zamykanie to chętnie wypełni ankietę? Nie. Zmuszanie jest chamskie, bezsensowne i złe. To nie z użytkownikiem jest coś nie tak, tylko ze zmuszającym.

Nie stawiaj tezy na wyrost i nie próbuj mnie umoralniać, bo to jest zbędne.
Zapomniałem zaznaczyć, że projekt nie będzie nigdy widoczny w internecie, a w intranecie dla stałej grupy odbiorców. Jeżeli ktoś chce skorzystać z kreatora to jest tego pewien i w większości opuszczenia kreatora w połowie pracy jest dość przypadkowe. Poszukam rozwiązania z window.onbeforeunload, ewentualnie zastosuje sposób z przetrzymywaniem danych w sesji choć byłoby to dość uciążliwe ze względu na ilość danych i zależności poszczególnych kroków od poprzednich - dużo łatwiej mi opierać się o dane w bazie.

0

@Vendro:
Ależ teza jest prawdziwa w każdym przypadku. Również w Twoim. Pisałem o zmuszaniu. Zmuszanie kogoś do czegoś polega na tym, że ktoś nie chce czegoś robić, a Ty jednak próbujesz to przeforsować. To jest be. Gdy ktoś tak naprawdę chce coś zrobić, tylko klika przypadkowo na Zamknij, a aplikacja go przed tym chroni, to wtedy to nie jest zmuszanie. Bo użytkownik chciał zostać na stronie (ino kliknął przypadkowo), nie jest do tego zmuszany.

Jeśli więc faktycznie nie zmuszasz nikogo do niczego i nikt tego tak nie odbiera, to po prostu nie napisałem, że to co robisz jest chamskie i wstrętne. Bo to dotyczyło zmuszania, które być może praktykowałeś (i dlatego o tym w ogóle wspomniałem), a być może nie.

0
bswierczynski napisał(a)

@Vendro:
Ależ teza jest prawdziwa w każdym przypadku. Również w Twoim. Pisałem o zmuszaniu. Zmuszanie kogoś do czegoś polega na tym, że ktoś nie chce czegoś robić, a Ty jednak próbujesz to przeforsować. To jest be. Gdy ktoś tak naprawdę chce coś zrobić, tylko klika przypadkowo na Zamknij, a aplikacja go przed tym chroni, to wtedy to nie jest zmuszanie. Bo użytkownik chciał zostać na stronie (ino kliknął przypadkowo), nie jest do tego zmuszany.

Ale popatrz na to z drugiej strony, do końca nie wiesz co oprócz zablokowania zamknięcia przeglądarki, czy wyjścia z danej podstrony chce zrobić. Chce zablokować "brutalne" wyjście poprzez pozostawienie wpisanych danych na pastwę losu, ale oprócz tego zaplanowane jest "bezpieczne" wyjście przez odpowiedni przycisk, który wyczyści wcześniej wprowadzone dane z bazy. Poza tym, ot tak przypadkowe wejścia do kreatora nie mają być wiążące, pierwszy krok nie zapisuje danych, więc jest możliwość opuszczenia go bez zbędnych formalności.

[dopisane 15:29]
podobne wyjście ma Gmail, chroniący przed utratą niezapisanego maila. Tutaj jest dość fajnie to rozwiązanie opisane:
http://www.losoft.org/blog/2009/10/blokada-wyjscia-ze-strony/

A wstęp do wpisu na blogu jest najbardziej adekwatny do tego co chce osiągnąć:

losoft.org napisał(a)

Wyobrazmy sobie pania Jole, ktora plodzi cos przez godzine, nastepnie klika przycisk Odswiez i cala jej prace szlag trafia. Znajoma sytuacja? Dlatego tez czasem musimy zabezpieczyc dane uzytkownikow, przed nimi samymi.

Najlepsza metoda na zabezpieczenie wiekszosci takich przypadkow, tzn. wywolanie funkcji Wstecz, Dalej, Odswiez czy Strona domowa, jest podpiecie sie pod zdarzenie onbeforeunload i wyswietlenie stosownego komunikatu, aby user mial czas zastanowic sie czy na pewno chce zrobic to co robi.

0

@Vendro:
Potwierdzenie w GMailu jest OK -- przyszło mi na myśl już podczas pisania pierwszego posta. Ponownie, takie potwierdzenie nie jest jednak uporczywym blokowaniem. To tylko potwierdzenie. Takie rzeczy można stosować, byle oszczędnie -- dla najważniejszych czynności i gdy nie można zrobić funkcji Cofnij (wtedy potwierdzenie nie jest konieczne). Zresztą, GMail też gdzieniegdzie stosuje Cofnij zamiast potwierdzenia, które jednak trochę upierdliwe potrafi być.

Gdy już jest to potwierdzenie, to zawsze możesz kliknąć na "OK" i wyjść ze strony po tym jednym dodatkowym kliknięciu. To coś zupełnie innego niż chamskie zagrania w stylu tworzenie nowego okienka w chwili starego, czy inne sposoby nie dające użytkownikowi normalnej możliwości zrobienia tego, co chce zrobić. Nie nazwałbym tego blokowaniem, tylko potwierdzaniem wyjścia. Bo wiesz, "blokować" to można na różne sposoby. Np. wyświetlać niekończący się ciąg okienek modalnych. Takie zagrania są już po prostu ohydne :).

0

bswierczynski - za dużo ostatnio moralizujesz, czy jesteś nowym wcieleniem Adama Pilorza? Bo ten ostatni gdzieś przepadł, a wyczuwam podobieństwo :)

0

@Marooned:
Kogo? W reinkarnację nie wierzę. Poza tym, nawet jeśli istnieje, to w poprzednim wcieleniu byłem raczej na przykład.... nosorożcem, dajmy na to.

Ale może po prostu na starość już zupełnie stetryczałem.

Powyższe "moralizowanie" to tylko kwestia web-usability. Może i nazwa jest adekwatna, bo jedna z podstawowych zasad to "sprawić, by strona nie wkurzała swoich odbiorców". I dotyczy to również intranetu. Podejście, że użytkownicy są głupi i trzeba im blokować wyjście ze strony daleko nas nie zaprowadzi. Przy czym za blokowanie uważam takie chamskie niekończące się pętle potwierdzeń, popupów, czy coś w tym stylu. Wyświetlenie jednego okienka nazwałbym "potwierdzeniem". To już bywa zupełnie OK, choć naturalnie nie każda strona powinna to robić. Wyobrażasz sobie jaka by to była katastrofa, gdyby tak było? Przeglądarki musiałyby zaimplementować kolejne blokery.

Zresztą coś podobnego wdarło się tu na forum w postaci chamskich reklam bez zamykającego krzyżyka. Na szczęście dobrze sobie z tym poradziliście :P.

Ale skoro piszesz, że "za dużo", to postaram się "moralizowanie" ograniczać.

edit: No chyba że ktoś będzie twierdził, że klamry przy instrukcjach należy stawiać w linijce innej niż jedyna słuszna... ;)

0
Marooned napisał(a)

Adama Pilorza? Bo ten ostatni gdzieś przepadł
U, z "reala" go znam, zajęty babką jest imho.. :>

0

Fiu, fiu.. się porobiło, świat się wali! ;)
Dzięki za update :)

To najlepszego przekaż od ekipy 4p! :)

0

Hehe, witam ponownie i dziękuję za życzenia :)

A jeśli chodzi o to, co porabiam, to faktycznie trochę zajęty jestem, dlatego też ograniczyłem zakres stron internetowych, które regularnie odwiedzam ;) Ale miło, że ktoś jeszcze o mnie pamięta :]

A wracając do innych wcieleń - raczej nie jestem z takich, coby się ukrywali i udawali, że są kimś innym, bo ktoś tam za mną nie przepada ;)

0

hehe, spoko, to z przymrużeniem oka było rzecz jasna :)

0

Wracając do tematu :)
Oparłem się całkowicie o skrypt z bloga powyżej, czyli:

var isChanged = false;
function setIsChanged(value)
{
	isChanged = value;
};

function preventLostData(event)
{
	if (!event) event = window.event;
	if (isChanged) {
		if (window.navigator.appName == "Microsoft Internet Explorer") {
			event.cancelBubble = true;
		}
		event.returnValue = "Nacisnij \"Zapisz zmiany\", aby uchronic sie przed utrata danych.";
		if (event.stopPropagation) {
			event.stopPropagation();
			event.preventDefault();
		}
	}
};

Ale w przypadku jeżeli użytkownik naciśnie przycisk OK co jest równoznaczne z opuszczeniem strony chciałbym wyświetlić jakąś stronę lub ajaksowo odwołać się do innej, jest to w tym przypadku możliwe ?

0

Ja mam dość podobne pytanie do kolegi, ale w innym trochę kontekście.
Mam taki nazwijmy to "info-kiosk" z ekranem dotykowym, bez klawiatury i myszki. Na tym ekranie będzie wyświetlana strona internetowa z dysku w trybie pełnoekranowym. Strona jest tylko w HTML i ma skrypty Java. I potrzebuje tak zrobić, aby turyści korzystający z tego info- kiosku nie mogli zamknąc tej przeglądarki z tą stroną, żeby inni mogli też z tego korzystać. Co wiecie jak to rozwiązać?

0

jest roznica miedzy java a javascript, a ty chyba jej nie dostrzegasz?

zalezy czy infokiosk pozwala zrobic "prawoklik" (albo szybkie stukanie, albo przytrzymanie w jednym miejscu) - wtedy mozna zrobic wszystko, łącznie z wylaczeniem calego kiosku ^^
jezeli nie umozliwiasz prawokliku, przegladarka na pewno Ci nie wyjdzie z trybu pełnoekranowego, i nie masz odnosnikow do innych stron - to raczej nic sie nie stanie.

0

myślę, że powinieneś raczej poszukać odpowiedniej przeglądarki, albo zmodyfikować jakąś OS względnie napisać własną a nie szukać rozwiązań frontendowych w html i js.
Google mówi:
http://www.google.pl/search?q=kiosk+browser
http://www.google.pl/search?q=infokiosk+browser
itp. Poszukaj, teraz to popularne.

Ale tym chyba powinna się zająć osoba odpowiedzialna za przygotowanie samego kiosku-no chyba, że jesteś one man army:)

0

Po pierwsze zajmuję się pisaniem stron tylko i wyłącznie w HTML z wykorzystaniem skryptów JavaScript, więc mogę powiedzieć że to amatorka :)
Po drugie info- kiosk jest firmy Magnus, która dawno już upadła i obecnie nawet nie ma softu nawet do nowszych systemów.
Po trzecie nie ma możliwości prawokliku, jednak po przejściu do trybu pełnoekranowego nasuwając kursorem w "rejony" górnego paska pojawia się on i wtedy można kliknąć krzyżyk i zamknąć przeglądarkę. Wtedy każdy dostaje dostęp do wszystkiego co na kompie. A chodzi mi właśnie o to, żeby z tej przeglądarki nie można było wyjść.

0

No ale jeśli to stoi na normalnym Windowsie, to możesz wgrać co chcesz łącznie z jakimś prostym browserem. Wrzucić na formę TWebBrowser w Delphi i ustawić kilka opcji to 5 minut, nawet dla początkującego.

0

poradzilem sobie w inny sposob. Najnowsza opera ma tryb Kioskmode i on blokuje wszystko.

1 użytkowników online, w tym zalogowanych: 0, gości: 1