Toon posts:

[JS] Eenmalige redirect i.c.m. browser back-button

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig een web-applicatie te ontwikkelen, en daarvoor is het belangrijk dat de gebruiker makkelijk de back-knop kan gebruiken in de browser om zo naar oude pagina's terug te gaan. Echter moeten 'zeer oude' pagina's wel gerefresht worden, en ook als een zelfde pagina opnieuw wordt opgevraagd (bijvoorbeeld een 'overzicht' pagina via een link in een pagina) moet deze niet uit de cache komen.

Om te zorgen dat dit netjes werkt heb ik de volgende dingen gedaan:
- via http-headers heb ik de caching tijd op 10 minuten gezet. Dit zorgt dat zeer oude pagina's niet meer zichtbaar zijn.
- er is een 'update' counter die bij iedere request opgehoogd wordt, en in een cookie wordt opgeslagen. Deze waarde wordt ook als een soort dummy get-variable in links gezet. Dit zorgt dat als iemand de zelfde (overzicht) pagina opnieuw opvraagt door op een link te klikken, deze toch opnieuw gegenereerd wordt en niet uit de cache komt.

Dit werkt allemaal naar tevredenheid, maar ik wil meer :)

Ik heb nu een pagina die op basis van een POST request allerlei processing doet (database updates, en meer) en dan als deze processing OK is, de gebruiker door moet sturen naar een overzichtspagina. Als de processing niet OK is, moet deze redirect niet worden uitgevoerd.

Op de betreffende pagina print ik nu eerst regelmatig output (met flush()) om de gebruiker te laten zien wat er gebeurt (de processing kan tot een minuut duren, en het is dus nodig om de gebruiker af en toe te laten weten dat er nog wat gebeurt). Daarna blijkt pas of het proces geslaagd is, en kan ik dus niet meer bij de http-headers.

De redirect doe ik nu door op het moment dat de processing succesvol is afgerond, een <SCRIPT> te printen die de document.location verzet.

De redirect gaat dan prima, maar het probleem zit hem er in dat de back-knop dezelfde pagina laadt (uit de cache) waar inmiddels die <SCRIPT> tag in staat en meteen weer naar de overzichtspagina gaat.

Wat ik zou willen, is 'iets' om de redirect dus eenmalig uit te voeren, en niet meer als de gebruiker de back-knop gebruikt heeft.

Eerst dacht ik simpel een variable op '1' te kunnen zetten en die te controleren, maar dingen als javascript variablen worden bij het back gaan gereset dus dat werkt niet, en dingen die ik in een cookie/sessie opsla worden niet bekeken omdat de pagina uit de cache komt.

Ik vraag me dus af of er nog een manier is om mijn doel te bereiken...

Ik design dit overigens hoofdzakelijk voor IE, maar vindt het wel prettig om het zoveel mogelijk browser-onafhankelijk te houden zodat de browser keuze in principe vrij is en blijft.

Verwijderd

Hoe laat je de javascript redirecten?

Als je de location.href verandert wordt er wel een entry genaamt in de history van de browser, als je gebruik maakt van location.replace('http://bla.com/') zou de huidige entry overschreven moeten worden. Het gevolg zou moeten zijn dat je in één keer terug kunt naar de pagina voor de "zware" pagina.

[ Voor 5% gewijzigd door Verwijderd op 03-08-2005 19:17 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Wat jij wil heeft niks met PHP te maken. Ik verander de PHP-tag in je titel dus in een JS-tag, en verplaats je topic naar Webdesign & Graphics, waar het beter past. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
In de script-tag doe ik gewoon
code:
1
document.location='nieuwe_locatie.php';


Het is overigens de bedoeling dat de output van de processing wel gewoon in de history zou moeten zitten. Immers als iemand niet zit op te letten (ja, stom natuurlijk) kan die niet meer zien wat er gebeurd is als de output-pagina verdwenen is in de history. Ik kan die location.replace wel eens proberen om het effect te beoordelen.

Ik zat ook te denken dat het makkelijkste zou zijn als het mogelijk was om in de 'future' history van de browser te kijken om te zien of die leeg was (eerste keer dat de pagina geladen werd) of niet (back-button gebruikt). Helaas kon ik niets vinden over zo'n feature en is de kans groot dat als het kan, het erg browser specifiek is.

  • André
  • Registratie: Maart 2002
  • Nu online

André

Analytics dude

1 ding snap ik niet: bij een succesvolle pagina volgt een redirect maar als mensen op back drukken mogen ze hem wel zien. Waarom laat je die redirect dan niet achterwege en maak je daar een knop voor oid?

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

het is sowieso window.location; location als property van het document object is deprecated en vervangen door document.URL (read-only)

niet dat dit wat uitmaakt voor het probleem. maar gewoon ter info

[ Voor 23% gewijzigd door crisp op 03-08-2005 22:58 ]

Intentionally left blank


Verwijderd

Topicstarter
André schreef op woensdag 03 augustus 2005 @ 22:00:
1 ding snap ik niet: bij een succesvolle pagina volgt een redirect maar als mensen op back drukken mogen ze hem wel zien. Waarom laat je die redirect dan niet achterwege en maak je daar een knop voor oid?
Het idee is dat het handig is om de gebruiker een klik te besparen door na het succesvol processen, automatisch naar het overzicht-scherm terug te gaan* waar hij vandaan kwam (bv een browse- of search-pagina). Dat wil niet zeggen dat hij achteraf nog eens op zijn gemak het 'succesvol' scherm mag zien mocht hij dat willen. Bovendien is het grootste probleem dat op mijn oude manier de back button effectief disabled is en de gebruiker dus *helemaal* niet meer terug kan. Immers wordt de redirect op de gecachte pagina direct uitgevoerd en moet je dus het pull-down menu van de history gebruiken om er voorbij te komen - en dat is waarschijnlijk iets waar de doelgroep op vast kan lopen.

Op zich is het misschien inderdaad niet zo veel moeite voor de gebruiker om die extra klik te doen, en is een redirect dus alleen maar lastig. Ik wil echter niet bij voorbaat een gebruikersvoordeel (als het dat echt is) opofferen voor 'iets' makkelijker developen.

* Terug is in dit geval 'verder', omdat het 'processen' wijzigingen heeft veroorzaakt en het overzicht dus gerefresht moet worden.
het is sowieso window.location
offtopic:
Ben niet zo heel veel thuis in Javascript, en maak veel gebruik van google voor het vinden van howto's en daar zit nog wel eens wat oude rommel tussen. 't Is altijd goed om te leren hoe iets *wel* moet :)
Pagina: 1