Avatar billede angelenglen Nybegynder
06. september 2012 - 14:10 Der er 16 kommentarer og
2 løsninger

Fang tryk på tilbage-knappen

Jeg har en side med rigtigt meget dynamisk indhold.
Faktisk indlæses alt dynamisk via Ajax og Javascript.

Derfor er det uheldigt hvis folk trykker på "tilbage" da de så forlader min side og ender hvor de var før de klikkede sig ind på min side.

Så det jeg godt kunne tænke mig, var at kunne opdage at folk trykker på tilbage, og gør noget andet i stedet for.
- fx at jeg kalder en javascript, fx ved navn "tilbage();"

På den måde kan jeg sende brugeren til det indhold de tidligere så, frem for at de forsvinder væk fra siden helt.


...men hvordan - og kan det overhovedet lade sig gøre?
Avatar billede mireigi Novice
06. september 2012 - 14:13 #1
Avatar billede angelenglen Nybegynder
06. september 2012 - 14:22 #2
jo jo, de fanger tryk på "backspace" knappen.

Men hvad med browserens tilbage-knap?
eller tilbage-knappen på musen.
Avatar billede olebole Juniormester
06. september 2012 - 14:29 #3
<ole>

Det er der ikke nogen standardiseret metode til. Der har gennem tiden eksisteret forskellige dårlige hacks, men der er ikke noget, som fungerer ordentligt - og hvad ville du have ud af det? Når først brugeren har trykket på knappen, kan du ikke cancel'e handlingen. Back knappen er en del af browserens navigationsværktøjer, som naturligvis ikke må kunne disables.

Men det er der jo ikke noget nyt i. Sådan har vi siden begyndelsen af 90'erne levet med, at en browser virker ... og det er jo gået meget godt  =)

/mvh
</bole>
Avatar billede softspot Forsker
06. september 2012 - 14:34 #4
Her er nogle forskellige bud (godt nok lidt gamle og sikkert ikke optimale som Ole påpeger):

http://www.aspsnippets.com/Articles/Disable-Browser-Back-Button-Functionality-using-JavaScript.aspx
http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript
http://forums.asp.net/t/342303.aspx

Jeg synes dog jeg har læst, et eller andet sted, at man i nyere browsere kan styre back-knappen mere end det hidtil har været muligt. Dette er jeg dog slet ikke sikker på, så betragt det som en teaser til at du selv undersøger det lidt nærmere. Det kan være andre her på eksperten kan be- eller afkræfte dette (men det har Ole jo nok allerede gjort i sit indlæg)...
Avatar billede olebole Juniormester
06. september 2012 - 14:47 #5
- men hvordan skal jeg så bære mig ad med at vende tilbage til siden før - hvis det er det, jeg som bruger ønsker?

Er fejlen ikke, at man (formodentlig fejlagtigt) forestiller sig, at ens egen side er så blændende fantastisk, at ingen nogensinde vil ønske at forlade den - og derfor kan tillade sig at disable brugerens navigationsmuligheder? Der er jo ingen, der siger, at brugeren ikke ønsker at navigere væk fra siden  *o)
Avatar billede softspot Forsker
06. september 2012 - 15:00 #6
Jamen, du har naturligvis ret, Ole...

Men spørgeren har jo fundet den ultimative hjemmeside, så du behøver ikke springe tilbage og hvis du ønsker at springe tilbage, så er det naturligvis for at se de genialiteter sitet havde at byde på, på det forrige skærmbillede... og ikke det inferiøre site man kom fra.

Anyway! Er der så en konstruktiv forslag til en måde, hvorpå man kan registrere navigation fremad, således ens history kommer til at indeholde de handlinger man har foretaget sig på den side der er komplet styret af AJAX-opdateringer. Kunne det evt. være noget med navigere til en hashed url (á la #updateX, hvor X er et fortløbende nummer), således der opbygges en history uden at siden faktisk skifter...?
Avatar billede softspot Forsker
06. september 2012 - 15:01 #7
"en konstruktiv forslag" er så den jyske måde at sige "et konstruktivt forslag"... :-)
Avatar billede softspot Forsker
06. september 2012 - 15:21 #8
Bruger du i øvrigt et JS MVC framework (f.eks. AngularJS)?

Nogle af disse giver mulighed for at "route" indhold, som det kendes fra f.eks. .NET Routing, som bla. MVC gør brug af, men altså uden at siden skifter som sådan. Såvidt jeg husker gør AngularJS det vist via hash-værdier i url'en (in-page-links?)... mon ikke det er metoden du søger. Jeg tror i øvrigt AngularJS kunne være rigtig interessant for dig at kigge på, hvis du altså ikke allerede benytter dig af et JS MVC framework...
Avatar billede olebole Juniormester
06. september 2012 - 15:25 #9
At sætte location.hash er en udbredt fremgangsmåde. Det kan gøres noget i stil med:

<a href="doc.php?page=foobar" onclick="ajaxLoad(this.href);location.hash='foobar';return false">Load side foobar</a>
Avatar billede olebole Juniormester
06. september 2012 - 15:29 #10
- og det kræver så, at man detekterer location.hash, når siden loades - og loader de tilhørende data. Ellers er det jo heller ikke muligt at sende et link til en specifik sidetilstand til en ven
Avatar billede angelenglen Nybegynder
06. september 2012 - 15:51 #11
For det første tak for forslagene :-)

Og selvfølgelig er min side så blændende fantastisk, at ingen nogensinde vil ønske at forlade den ;-)

Nej ok, i har ret i at jeg ikke lige havde tænkt på at jeg faktisk ville fange brugeren på siden ved den fremgangsmåde, og det er jo egentligt ikke meningen.
Jeg er bare træt af at det ind imellem sker ved et uheld.

Men kan godt se der nok ikke er en foolproof måde at gøre det på, og så er det måske i virkeligheden bedre at lade helt være - i stedet for at gøre det halvt så det virker for nogen men ikke andre, og kun i få situationer :-(
Avatar billede olebole Juniormester
06. september 2012 - 16:10 #12
Problemet er netop, at man kan 'spærre' en bruger inde på sitet - bevidst eller ubevidst. Derfor har browserleverandører altid forsøgt at gøre den slags vanskeligt/umuligt i takt med teknologiens og opfindsomhedens udvikling  =)

Du skal i øvrigt tænke på, at søgemaskiner ikke læser JavaScript og derfor heller ikke umiddelbart selv ser dit Ajax-loadede indhold. Du må servere indholdet specielt for søgemaskinerne, enten via et MVC-framework eller noget funktionalitet efter princippet i #9
Avatar billede angelenglen Nybegynder
07. september 2012 - 09:03 #13
God pointe med søgemaskinerne, heldigvis er det til en backend hvor Google bare skal holde sig væk fra ;-)

Og ved nærmere eftertanke vælger jeg nu at droppe idéen.
Den var vist ikke helt gennemtænkt :-D

I er alle meget velkomne til at lægge svar, da jeres inputs har hjulpet selvom jeg nu vælger ikke at udføre planen.
Avatar billede softspot Forsker
07. september 2012 - 10:36 #14
Hvis det er en backendløsning, synes jeg stadig du bør tage nogle timer ud af kalenderen og kigge på AngularJS. Det ser virkelig interessant ud, hvis du tænker i retning af at lave en singlepage-løsning. Det har en masse værktøjer, bla. til at gøre kobling af data mellem UI og JS-objekter let, routing (som skulle håndtere din aktuelle udfordring) og mange andre features.

Det er Google der står bag det, så jeg vil tro det får den fornødne opmærksomhed (i det mindste indtil de skrotter det ;-)).

http://angularjs.org/
Avatar billede olebole Juniormester
07. september 2012 - 12:44 #15
Det er bare ærgeligt, man øjensynligt ikke har sørget for muligheden for at skrive valid HTML og bruge AngularJS samtidigt
Avatar billede softspot Forsker
07. september 2012 - 13:06 #16
Jeg ved ikke nok om standarderne til at kunne udfordre dig på den udtalelse, så det skal nok passe. Kan du give nogle eksempler på specifikke features du hæfter dig ved, som ikke overholder standarderne for HTML5?

Hvis man bruger det i et homogent miljø, hvor man har en vis grad af kontrol over, hvilke klienter der skal køre systemet, har man i det mindste mulighed for at teste om det kan køres af dem der måtte have behov for dette...
Avatar billede softspot Forsker
07. september 2012 - 13:07 #17
...altså bort set fra at HTML5 ikke er en standard endnu :-)
Avatar billede olebole Juniormester
07. september 2012 - 13:50 #18
@softspot: Jo og nej. HTML5 er ikke en standard efter den gamle definition. Skal man på den anden side holde sig til den definition, når HTML5 først 'Recommendation' status i 2022 - og bliver først dermed endelig standard.

Derfor har man valgt at lade HTML5 adskille sig væsentligt fra tidligere versioner med en inkrementel model. Altså en model, hvor de enkelte features bliver implementeret efterhånden som modulerne når 'Canididate Recommendation' status (eller endda før) - hvilket i skrivende stund er tilfældet med langt de fleste.

Efter at have kikket lidt mere på AngularJS, kan jeg dog se, at det faktisk er muligt at overholde HTML5 - hvis man prefikser alle direktiver/attibutter med 'data-'. En mulighed, man skal grave godt i dokumentationen for at finde  =)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester