Avatar billede phreazdialer Nybegynder
07. februar 2007 - 12:42 Der er 6 kommentarer

Gemme formdata automatisk når en side forlades,

Jeg prøvede før at oprette et spørgsmål, men jeg kan ikke finde det nogen steder, så jeg prøver igen...

Jeg arbejder på et sagsbehandlings system, på et Intranet. Når man i sagsbehandlings systemet åbner en sag startes en tidstæller. Det er et simpelt javascript som i en form viser tiden i et disabled text felt.

Når formen gemmes, dvs. når en sag opdateres, gemmes tidstælleren i forbindelse med at der indsættes en ny handling i en database, men jeg vil gerne have at den også gemmes hvis siden forlades på anden vis, f.eks. ved et uheld, eller hvis den forlades for bevidst at undgå at tiden registreres.

En mulighed kunne være at lade OnBeforeUnload vise en advarsel, men jeg kunne godt tænke mig at der ikke kom nogen advarsel, men at tidstælleren blot blev gemt automatisk.

Jeg tænkte først på muligheden at lave en skjult frame som bliver aktiveret af OnBeforeUnload, men jeg er ikke sikker på at man kan kontrollere at den får udført et asp-script som indsætter i en database, før siden forlades, så den er jeg gået lidt væk fra.
Til gengæld har jeg tænkt på de her popup vinduer hvor der ikke vises ramme, menulinie, hoved osv., altså hvor det vil være muligt at åbne en popup på 0x0 pixels, så brugeren ikke ser det (Er det ikke dem der hedder modelessdialog?).
Denne popup skal så åbne et asp-script via en url med en querystring indeholdende den aktuelle værdi af text feltet hvor tælleren vises. asp-scriptet skal så sørge for at indsætte en handling i en database hvorved tiden registreres, og derefter "lukke" det usynlige popup vindue.

asp-scriptet skal jeg nok selv udforme, men jeg mangler lidt inspiration til hvordan jeg kan sørge for at åbne det skjulte popup vindue OnBeforeUnload og hente værdien af text feltet og smide i en querystring. Dette skal selvfølgelig kun ske såfremt siden forlades på unormal vis, d.v.s. at den ikke skal åbne en popup hvis formen submittes.

Ja jeg ved godt at OnBeforeUnload er en IE ting, men alle brugere på Intranet anvender MSIE6+, så det bliver intet problem.

Nogen der kan hjælpe med denne?
Avatar billede coderdk Praktikant
07. februar 2007 - 13:07 #1
Virker denne ikke?

<body onunload="document.getElementById('frm').submit()">
<form name="frm" id="frm" method="post" action="ditscript.asp">
Avatar billede phreazdialer Nybegynder
07. februar 2007 - 13:09 #2
Her er lidt af det jeg ønsker.
Det jeg behøver hjælp til er funktionen "saveonexit()":

<HTML>
<HEAD>
<SCRIPT>
  function saveonexit() {
    if (manikketrykkedepåsubmit) {
      "åbnurliskjultpopup": saveonexit.asp?counter=(indhold af cbform.counter)
    }
  }
</SCRIPT>
</HEAD>
<BODY OnBeforeUnload="saveonexit();">
<FORM NAME="cbform">
  <INPUT TYPE="text" NAME="counter" VALUE="01:12:42" DISABLED>
  <INPUT TYPE="submit" NAME="submitform" VALUE="Opdater sag">
</FORM>
</BODY>
</HTML>
Avatar billede phreazdialer Nybegynder
07. februar 2007 - 13:20 #3
Hov, min kommentar krydsede coderdk's kommentar.

Jeg har dog netop prøvet denne mulighed, og har selv tidligere prøvet en lignende metode, men får det ikke til at virke.
Så prøvede jeg at tilføje lidt hjælp til debugging på koden:

<body onunload="alert('1');document.getElementById('frm').submit();alert('2');">

Når jeg forlader siden uregelmæssigt får jeg en pop '1', når jeg trykker OK på den "blinker/genindlæses" siden, hvorefter jeg får en pop '2'.
Selv om siden "blinker/genindlæses" eller hvad den gør, så forbliver jeg på formen, og submittes ikke videre til det andet asp script som gemmer dataene.

Jeg kunne forestille mig at en OnBeforeUnload forhindrer at brugeren sendes til en anden side, og det er derfor jeg i første omgang var ude i tanken om en skjult frame eller endnu bedre en skjult popup.
Avatar billede coderdk Praktikant
07. februar 2007 - 13:26 #4
Du kan nok ikke lave en skjult popup, men bare lav vinduet lille og sørg for at det selv lukker sig igen (window.close() i javascript)... Prøv noget i stil med:

<HTML>
<HEAD>
<SCRIPT>
  var butpress = false;
  function saveonexit() {
    if (!butpress) {
      v = document.getElementById("cntr").value;
      window.open("saveonexit.asp?counter=" + v, "save", "left=20,top=20,width=20,height=20,toolbar=0,resizable=0");
    }
  }
</SCRIPT>
</HEAD>
<BODY onunload="saveonexit();">
<FORM NAME="cbform">
  <INPUT TYPE="text" id="cntr" NAME="counter" VALUE="01:12:42" DISABLED>
  <INPUT TYPE="submit" NAME="submitform" onclick="butpress=true;" VALUE="Opdater sag">
</FORM>
</BODY>
</HTML>
Avatar billede phreazdialer Nybegynder
07. februar 2007 - 14:10 #5
Jeg havde selv overvejet denne "almindelige" popup som en nødløsning, men jeg er faldet over noget som vist nok kaldes modelessdialog og som skal kunne det jeg ønsker, jeg kan bare slet ikke gennemskue hvordan jeg kan få det til at spille.

Min tanke var at lave det som på f.eks. hotpeople.dk med en lille beskedboks der popper op i bunden af skærmen, og så blot lave boksen 0x0 pixels. Det er godtnok et par år siden jeg har kigget på hotpeople så jeg ved ikke om de bruger det længere, men der må være nogen der ved hvad det er jeg mener?
Avatar billede phreazdialer Nybegynder
07. februar 2007 - 20:07 #6
Nu har jeg efterhånden fået bikset en kode sammen, med lidt hjælp fra coderdk's forslag, samt en smule kode jeg havde liggende fra et gammelt testprojekt.

Det virker, og jeg får registreret det jeg skal, men kun ca. hver tredie gang, så jeg tror det skyldes at popup'en lukkes for hurtigt. Er der nogen der har et smart forslag til hvordan man kan holde popup'en åbnet bare et par hundrede millisekunder længere?

Det skal forøvrigt lige siges at den html kode der vises i popup vinduet har drillet mig lidt. Det viste sig at jeg på ingen måde kunne lave nogen form for scripting bortset fra gængs html i en sådan popup. Jeg forsøgte derfor at lave en IFRAME og loade url'en i den, men det ville på ingen måde køre. Jeg kom så i tanke om at lave et IMG og lade url'en være et asp-script som først eksekverer lidt kode (javascript desværre ej muligt) og derefter redirecter til et billede, og så virker det, men som sagt kun hver 3. gang.

Størrelsen på popup'en er for debuggingens skyld sat til 100x100 px, men den ændrer jeg til 1x1 når det engang virker.

Min kode ser sådan ud:

<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
<!--//
    var butpress = false;
    var counter = 0;
    var seconds = 0;
    var minutes = 0;
    var hours = 0;
   
    function StartCounter()    {
        window.setTimeout("StartCounter();", 1000);
        counter = (counter + 1);
        seconds = (seconds + 1);
        if (seconds == 60) {
            minutes = (minutes + 1);
            seconds = 0;
            }
        if (minutes == 60) {
            hours = (hours + 1);
            minutes = 0;
            }
        if (seconds >= 10) {
            dispseconds = seconds;
            }
        if (seconds < 10) {
            dispseconds = '0' + seconds;
            }
        if (minutes >= 10) {
            dispminutes = minutes + ':';
            }
        if (minutes < 10) {
            dispminutes = '0' + minutes + ':';
            }
        if (hours >= 10) {
            disphours = hours + ':';
            }
        if (hours < 10) {
            disphours = '0' + hours + ':';
            }
        entryform.counter.value = counter;
        entryform.clock.value = disphours + dispminutes + dispseconds;
    }

    function ShowPopup() {
        if (!butpress) {
            if (window.createPopup){
                var mailpopup = window.createPopup();
            }
            v = document.getElementById("counter").value;
            mailpopup.document.body.innerHTML = '<IMG SRC="OnBeforeUnload.asp?counter='+v+'" WIDTH="100" HEIGHT="100">';
            window.clearInterval(0);
            window.setTimeout("mailpopup.hide();",1000);
            mailpopup.show(0,0,100,100);
        }
    }
   
    //-->
    </SCRIPT>               
</HEAD>
<BODY OnLoad="StartCounter();" OnBeforeUnload="ShowPopup();">
<FORM NAME="entryform" METHOD="post" onsubmit="submitted=true;">
    <INPUT TYPE="hidden" NAME="counter" ID="counter" VALUE="0">
    <INPUT TYPE="text" SIZE="6" NAME="clock" VALUE="00:00:00" DISABLED>
    <INPUT TYPE="submit" NAME="submitform" onclick="butpress=true;" VALUE="Opdater sag">
</FORM>
</BODY>
</HTML>


############ ############ ############ ############ ############ ############ ############ ############ ############ ############ ############ ############



Koden til filen OnBeforeUnload.asp ser sådan ud:

<%
'her placeres koden til indsættelse i databasen.
'(udeladt)

'her redirectes til et tilfældigt billede:
response.redirect("http://www.google.com/intl/da_ALL/images/logo.gif")
%>
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