Avatar billede loukas Mester
24. september 2012 - 15:03 Der er 12 kommentarer og
1 løsning

Opdater varekurv

Hej,
Jeg har lavet en side hvor der handles tøj og der til
en varekurv som jeg includer på alle sider
<!--#INCLUDE FILE="kurv.asp"-->
Men hvis en kunde putter noget i kurven og klikker på tilbage knappen, viser den en tom kurv fordi den bare bruger cachen og ikke viser den opdaterede kurv med indhold.

Håber der er nogen som har god ide til en løsning
Avatar billede softspot Forsker
24. september 2012 - 15:18 #1
Kunne du lave en baggrundsopdatering med AJAX i stedet for en side med statisk indhold. Baggrundsopdateringen skulle så ske ved sidens load-event.
Avatar billede claes57 Ekspert
24. september 2012 - 15:34 #2
lav en stor/synlig 'tilbage' knap, hvor din kode har sat den relevante adresse.
Avatar billede loukas Mester
24. september 2012 - 16:04 #3
Jeg tror på den med ajax.
Men har ikke meget erfaring med det.

Har brugt følgende kode før.
Men hvordan opdaterer jeg den med sidens load-event ??

Henter den på siden sådan her:
<script type="text/javascript">
    ajaxpage(rootdomain + 'kurv.asp', 'kurv');
</script>

<div align="center" id="kurv" style="display:block; width:200px; height:100px" ></div>


// ***** Ajax Control *********************************************************

    var bustcachevar = 1 //bust potential caching of external pages after initial request? (1=yes, 0=no)
    var loadedobjects = ""
    var rootdomain = "http://" + window.location.hostname
    var bustcacheparameter = ""

    function ajaxpage(url, containerid) {
        var page_request = false
        if (window.XMLHttpRequest) // if Mozilla, Safari etc
            page_request = new XMLHttpRequest()
        else if (window.ActiveXObject) { // if IE
            try {
                page_request = new ActiveXObject("Msxml2.XMLHTTP")
            }
            catch (e) {
                try {
                    page_request = new ActiveXObject("Microsoft.XMLHTTP")
                }
                catch (e) { }
            }
        }
        else
            return false
        page_request.onreadystatechange = function () {
            loadpage(page_request, containerid)
        }
        if (bustcachevar) //if bust caching of external page
            bustcacheparameter = (url.indexOf("?") != -1) ? "&" + new Date().getTime() : "?" + new Date().getTime()
        page_request.open('GET', url + bustcacheparameter, true)
        page_request.send(null)
    }

    function loadpage(page_request, containerid) {
        if (page_request.readyState == 4 && (page_request.status == 200 || window.location.href.indexOf("http") == -1))
            document.getElementById(containerid).innerHTML = page_request.responseText
    }

    function loadobjs() {
        if (!document.getElementById)
            return
        for (i = 0; i < arguments.length; i++) {
            var file = arguments[i]
            var fileref = ""
            if (loadedobjects.indexOf(file) == -1) { //Check to see if this object has not already been added to page before proceeding
                if (file.indexOf(".js") != -1) { //If object is a js file
                    fileref = document.createElement('script')
                    fileref.setAttribute("type", "text/javascript");
                    fileref.setAttribute("src", file);
                }
                else if (file.indexOf(".css") != -1) { //If object is a css file
                    fileref = document.createElement("link")
                    fileref.setAttribute("rel", "stylesheet");
                    fileref.setAttribute("type", "text/css");
                    fileref.setAttribute("href", file);
                }
            }
            if (fileref != "") {
                document.getElementsByTagName("head").item(0).appendChild(fileref)
                loadedobjects += file + " " //Remember this object as being already added to page
            }
        }
    }
// ***** Ajax Control SLUT *******************************************************************
Avatar billede olebole Juniormester
24. september 2012 - 17:20 #4
<ole>

Når du opretter en kommentar her på Eksperten og trykker på 'Back', sker der ingen katastrofer - og sådan er det på de fleste sites. Det skyldes et godt, gammelt, gennemprøvet princip:

Når en form submittes, submittes den mod et dokument (f.eks. 'response.asp'). Dette dokument indsætter i databasen og returnerer brugeren til doukumentet med formen. Returneringen foretages med en HTTP-header - hvilket er hele hemmeligheden. Gør du sådan, kan 'Back' knappen ikke skabe problemer  *o)

Koden i #3 har ikke så meget med Ajax at gøre - og jeg forstår slet ikke dit ønske om at få koden kørt på sidens load event. Det skal vel ske, når brugeren lægger en vare i kurven (= trykker på en knap) ... eller?

/mvh
</bole>
Avatar billede softspot Forsker
24. september 2012 - 18:09 #5
Jeg er ikke klar over om browseren benytter sig af caching-headers, når trykker på tilbage-knappen. Hvis den gør, ville det måske være en mulighed for at undgå den tomme kurv, selvom der er lagt varer i kurven tidligere...
Avatar billede olebole Juniormester
24. september 2012 - 18:22 #6
Ved brug af #4 er der heller ikke problemer med caching headers. Netop fraværet af problemer er nok årsagen til, at den fremgangsmåde bruges så mange steder  =)
Avatar billede softspot Forsker
24. september 2012 - 18:38 #7
Men hvilke headers skal man så bruge?
Avatar billede olebole Juniormester
24. september 2012 - 18:50 #8
En location header. Formen i dokumentet side_med_form.asp submitter mod response.asp. I response.asp står noget i stil med:

' Indsæt i database
' - og hvad der ellers skal ske ...

Response.AddHeader "Location", "side_med_form.asp"
Avatar billede olebole Juniormester
24. september 2012 - 18:54 #9
PS: når brugeren kommer tilbage til side_med_form.asp og klikker 'Back', vil hun komme til siden, hun var på, før hun kom til side_med_form.asp i første omgang  =)
Avatar billede softspot Forsker
24. september 2012 - 19:04 #10
OK, men den side der så hentes ved tryk på tilbageknap, vil vel stadig indeholde det den indholdte, da man forlod siden (altså være den cached version af kurven, som den så ud inden der blev lagt noget i kurven)...?

Hvis det er tilfældet, er det så jeg foreslår, at man henter kurvens indhold ved load-eventet, for at den kan være opdateret også på cached sider, eller er det helt hen i hegnet?
Avatar billede olebole Juniormester
24. september 2012 - 19:38 #11
Det burde næppe være nødvendigt. Vi har lavet den slags sider uden problemer længe før Ajax blev almindeligt  =)

Når du skriver et indlæg på Eksperten, submittes formen mod http://www.eksperten.dk/besvar, der gør som vist ovenfor (omend det sker i PHP). Når du efterfølgende kommer tilbage til spørgsmålssiden, har der aldrig været problemer med caching - bortset fra i nattetimerne, hvor databaserne opdateres.

Hvis der stadig er problemer med caching, kan man forsøge med no caching headers. Mit ASP-classic er mere end rustent, men jeg mener, det er noget à la:

Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1

Ret mig endelig  =)
Avatar billede loukas Mester
29. september 2012 - 23:28 #12
Hej,
Jeg har prøvet med
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1

men det hindrer tilsyneladende ikke i at vise den cachede side når man bruger tilbageknappen.

Problemet er løst med ajax, men jeg vil aligevel eksperimenterer lidt
med: Response.AddHeader "Location", "side_med_form.asp"
Eller sende brugeren til en seperat side der ligger i kurven osv.
og der efter sender brugeren tilbage til varen.
Lige nu bliver brugeren på selve varen og kurven opdateres øverst på samme side.
Tak for hjælpen
Avatar billede loukas Mester
01. marts 2013 - 08:52 #13
Undskyld,
Havde glemt den
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
Kurser inden for grundlæggende programmering

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