Avatar billede bongii Nybegynder
21. november 2007 - 10:37 Der er 28 kommentarer og
3 løsninger

gemme direkte i session ved indtastning i form felt

Hej.

Hvis jeg nu har et formfelt:
<textarea cols="50" rows="30" name="test"></textarea>

... Hvordan gemmer jeg direkte data i en session når brugeren skriver i feltet.

Sådan at brugeren ikke behøves trykke på en submit knap for at gemme sine ændringer.
Avatar billede fennec Nybegynder
21. november 2007 - 10:44 #1
Det korte svar er "Det kan du ikke"

Session ligger på serveren, og for at serveren kan få de informationer, som brugeren indtaster, kræver det at det bliver sendt hertil.

Du kan dog lave noget workaround, hvor du autosubmitter informationerne.

Prøver lige at lave et eks... 2 sek.
Avatar billede fennec Nybegynder
21. november 2007 - 10:56 #2
<%
if Request.querystring("mode") = "save" then
    session("session1") = Request.Form("test")
    Response.write session("session1")
    response.end
end if
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>Untitled</title>
</head>

<body>
<form name="myForm" method="post" target="myIFrame" action="<%= scriptname %>?mode=save">

<textarea cols="50" rows="30" name="test" onkeyup="this.form.submit();"></textarea>

</form>
<iframe name="myIFrame"></iframe>

</body>
</html>
Avatar billede fennec Nybegynder
21. november 2007 - 10:57 #3
Der var lige en fejl. Manglede denne linje i starten:

scriptname = Request.ServerVariables("SCRIPT_NAME")
Avatar billede softspot Forsker
21. november 2007 - 11:00 #4
En lignende metode er et AJAX-kald via XMLHttpRequest-objektet, hvilket jeg tror vil fungere bedre end en iframe (uden dog at have prøvet det af i praksis).
Avatar billede softspot Forsker
21. november 2007 - 11:06 #5
Om ikke andet ville det nok være en idé at opdatere med lidt længere intervaller end hvert tastetryk. Jeg har en fornemmelse af at det kommer til at give en stop/go-effekt, hvis der opdateres ved hvert tastetryk. Man kunne f.eks. sætte en timer op, som sørger for at opdatere teksten på serveren. Det giver naturligvis en risiko for at hele teksten ikke gemmes (hvis siden skiftes inden sidste opdatering er gennemført), men det vil højst sandsynligt være sådan at størstedelen af teksten er gemt...
Avatar billede fennec Nybegynder
21. november 2007 - 11:14 #6
softspot >>
En delay på onkeyup kaldet burde også virke, så den f.eks først submitter 1 sek efter tastetryk.
Avatar billede bongii Nybegynder
21. november 2007 - 11:18 #7
Er det lettere i .NET?
Avatar billede fennec Nybegynder
21. november 2007 - 11:19 #8
<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">
<!--
var timeID
function submitForm()
{
    window.clearTimeout(timeID)
    timeID = window.setTimeout("document.myForm.submit();",1000)
}
//-->
</SCRIPT>
<form name="myForm" method="post" target="myIFrame" action="<%= scriptname %>?mode=save">
<textarea cols="50" rows="30" name="test" onkeyup="submitForm();"></textarea>
</form>
<iframe name="myIFrame"></iframe>
Avatar billede fennec Nybegynder
21. november 2007 - 11:20 #9
.NET er måske lettere da elementer kan køres fra serveren med runat="server". Ved dog ikke meget om det.
Avatar billede bongii Nybegynder
21. november 2007 - 11:22 #10
Det andet er alt for forstyrende for brugeren fennec.
Avatar billede fennec Nybegynder
21. november 2007 - 11:32 #11
Tænker du på iFramen??
Den skjuler du jo bare:
<iframe name="myIFrame" height="0" width="0"></iframe>
Avatar billede bongii Nybegynder
21. november 2007 - 11:39 #12
Kan man ikke lave noget cookie styring via javascript?
Avatar billede softspot Forsker
21. november 2007 - 14:25 #13
fennec >> iframe-opdatering på den måde vil også resultere i en masse klik hele tiden (om ikke andet i IE).
Avatar billede softspot Forsker
21. november 2007 - 14:26 #14
Du kan godt lave cookiestyring, men en cookie må ikke indeholde mere end 4 Kb data, så det er under alle omstændigheder en begrænset løsning.

Jeg tror du skal satse på at løse det med XMLHttpRequest...
Avatar billede softspot Forsker
21. november 2007 - 15:01 #15
Jeg har et eksperiment som du kan tage udgangspunkt i. Det er rå testkode, så der kan helt sikkert laves en del forbedringer og smarte features, men det er ikke formålet med dette post at vise sådanne ting... :-)

Testsiden som jeg har kaldt testSaveTextState.htm:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Test Save Text State</title>
    <script type="text/javascript">
        function xmlhttpPost(strURL) {
            var xmlHttpReq = false;
            var self = this;
            // Mozilla/Safari
            if (window.XMLHttpRequest) {
                self.xmlHttpReq = new XMLHttpRequest();
            }
            // IE
            else if (window.ActiveXObject) {
                self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
            }
            self.xmlHttpReq.open('POST', strURL, true);
            self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            self.xmlHttpReq.onreadystatechange = function() {
                if (self.xmlHttpReq.readyState == 4) {
                    updatepage(self.xmlHttpReq.responseText);
                }
            }
            self.xmlHttpReq.send(getquerystring());
        }

        function getquerystring() {
            var f = document.getElementById('frm');
            var t = document.getElementById("txt").value;
            qstr = 'txt=' + escape(t);
            return qstr;
        }

        function updatepage(str){
        }
       
        var tmr = null;
        function initSaveTextState() {
            // Så er der trykket på en taste i tekstfeltet, hvilket betyder at der
            // skal sættes en timer som kalder opdatering af teksten i session.
            // Hvis der allerede er en timer igang, så annulleres denne inden
            // den ny sættes igang. Dette er for at undgå for mange opdateringer
            // indenfor en kort periode...
            clearTimeout(tmr);
            tmr = setTimeout("xmlhttpPost('http://www.ditdomæne.dk/testSaveTextStateSvr.asp')", 1000);
        }
    </script>
</head>
<body>
<form id="frm">
    <textarea id="txt" style="width:300px;height:300px" onkeyup="initSaveTextState()"></textarea>
    <iframe style="width:300px;height:300px" src="testSaveTextStateView.asp"></iframe>
</form>
</body>
</html>

testSaveTextStateSvr.asp:

<%
Session("testTxtState") = Request.Form("txt") & ""
Response.Write("")
%>


og testsiden der hvert andet sekund viser hvad der pt. ligger i session-variablen:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Untitled Page</title>
    <script type="text/javascript">
    window.onload = function() {
        setTimeout("window.location.reload(true)", 2000);
    }
    </script>
</head>
<body>
    <%=replace(Session("testTxtState"), vbcrlf, "<br>") %>
</body>
</html>
Avatar billede softspot Forsker
21. november 2007 - 15:02 #16
Jeg skal for en god ordens skyld lige sige at selve AJAX-koden er sakset og tilpasset fra denne side: http://www.degraeve.com/reference/simple-ajax-example.php
Avatar billede bongii Nybegynder
21. november 2007 - 15:04 #17
ok kigger lige på det.
Avatar billede bongii Nybegynder
21. november 2007 - 18:53 #18
Det er ikke en holbar løsning softspot Hvad med noget cookie basseret javascript?
Avatar billede softspot Forsker
21. november 2007 - 22:33 #19
Kan du ikke specificere kravene lidt mere præcist, så vi kan ramme dine behov (som åbenbart strækker sig længere end at opdatere en session-variabel). En begrundelse for dit udsagn ville være lækkert :)
Avatar billede w13 Novice
21. november 2007 - 22:37 #20
Bongii>> Til denne slags til er AJAX den mest rigtige løsning. Det er sådan man kører et ASP-script uden at loade siden!

Så som Softspot siger: med mindre der er flere krav, vi endnu ikke kender, så er AJAX metoden! Fennecs IFrame er en lidt lettere løsning, men der er flere bagsider ved den. Bl.a. kliklyde i IE.
Avatar billede fennec Nybegynder
22. november 2007 - 09:12 #21
Lige en rettelse til softspot's kode:
tmr = setTimeout("xmlhttpPost('http://www.ditdomæne.dk/testSaveTextStateSvr.asp')", 1000);

Skal bare være:
tmr = setTimeout("xmlhttpPost('/testSaveTextStateSvr.asp')", 1000);

Hvis der er http med får man højestsansynlig en fejl, eller også startes en ny session hver gang.
Avatar billede softspot Forsker
22. november 2007 - 09:24 #22
fennec >> Jeg fik ikke nogen fejl da jeg testede det på min egen server ;-)
Avatar billede fennec Nybegynder
22. november 2007 - 10:08 #23
Ahhh, jeg fandt min "fejl".
Jeg kører både "www.domæne.dk" og "domæne.dk"

Går jeg ind på "www.domæne.dk" virker det fint, men går jeg ind på "domæne.dk" fejler den fordi den tror det er et andet domæne.

Om ikke andet så løser det problemet at sætte den til "/side" i stedet :o)
Avatar billede w13 Novice
29. juli 2008 - 10:48 #24
Lukketid?
Avatar billede bongii Nybegynder
29. juli 2008 - 11:04 #25
sry. Smid et svar.
Avatar billede w13 Novice
29. juli 2008 - 11:05 #26
Nu har jeg jo ikke hjulpet særlig meget her.. Fennec og Softspot burde nok dele, hvis de da lige svarer.
Avatar billede fennec Nybegynder
29. juli 2008 - 11:24 #27
.o) <-- One Eyed Jack
Avatar billede softspot Forsker
29. juli 2008 - 12:09 #28
:)
Avatar billede bongii Nybegynder
29. juli 2008 - 12:33 #29
Sådan drenge. Ud og nyd det gode sommervejr med jer :)
Avatar billede softspot Forsker
29. juli 2008 - 13:13 #30
Tak for point :)
Avatar billede bongii Nybegynder
29. juli 2008 - 13:42 #31
Det er mig der takker ! :)
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