Avatar billede trumf Nybegynder
31. maj 2006 - 11:21 Der er 25 kommentarer og
1 løsning

problem med setTimeout

Hejsa E

Jeg vil gerne vise en besked et par sekunder når en form submittes, hvis alle felter er udfyldt korrekt.

Jeg har kogt koden ned til følgende:

<html>
<body>
<script type="text/javascript">
<!--
function WebForm_OnSubmit() {
return send();
return true;
}
// -->
</script>
<script language="javascript" type="text/javascript">
function send() {
  var boolvar = true;
  if (1==2)
    boolvar = false;
  else {
    boolvar = true;
    setTimeout(showSaveMsg(),3000);
  }
  return boolvar;
}
function showSaveMsg() {
  document.write('<span>Data behandles</span>');
}
</script>
<form name="aspnetForm" method="post" action="test.html" onsubmit="java script:return WebForm_OnSubmit();" id="aspnetForm">
<input type="submit" value="send">
</form>
</body>
</html>

Der kommer en fejl om "invalid argument" i linie 18, men beskeden vises, dog ikke med timeout:
setTimeout(showSaveMsg(),3000);

Hvis jeg skriver det med gåseøjne i setTimeout("showSaveMsg()",3000); i stedet kommer der ingen fejl, men heller ingen besked.

Hvad gør jeg forkert ???
Avatar billede mclemens Nybegynder
31. maj 2006 - 11:49 #1
Prøv:

setTimeout(showSaveMsg(),3000);

->

setTimeout("showSaveMsg()",3000);
Avatar billede trumf Nybegynder
31. maj 2006 - 11:58 #2
Hvis jeg skriver det med gåseøjne i setTimeout("showSaveMsg()",3000); i stedet kommer der ingen fejl, men heller ingen besked.
Avatar billede mclemens Nybegynder
31. maj 2006 - 12:18 #3
Er det ikke fordi at den submitter formen
- og fordi at der ikke er noget ventetid
på at skaffe næste side ???


prøv:

function send() {
  var boolvar = true;
  if (1==2)
    boolvar = false;
  else {
    boolvar = true;
    setTimeout(showSaveMsg(),3000);

/* TILFØJET DENNE - for at se om det er fordi det
går for hurtigt med afsendelse af dataerne */
boolvar = false;

  }
  return boolvar;
}
function showSaveMsg() {
  document.write('<span>Data behandles</span>');
}
Avatar billede mclemens Nybegynder
31. maj 2006 - 12:23 #4
ps: ret lige
onsubmit="java script:return WebForm_OnSubmit();"
til:
onsubmit="return WebForm_OnSubmit();"
Avatar billede trumf Nybegynder
31. maj 2006 - 12:25 #5
Interessant....

Der sker det, at når der klikkes fryser siden i 3 sekunder hvorefter beskeden vises

hmmmm
Avatar billede trumf Nybegynder
31. maj 2006 - 12:26 #6
jeg kan ikke rette i den del af koden da det autogeneres af VS .net
Avatar billede mclemens Nybegynder
31. maj 2006 - 12:36 #7
Hvis du ikke kan rette i koden hjælper det nok ikke meget men prøv denne:


<html>
<body>
<script language="javascript" type="text/javascript">
function send(){
  var boolvar = true;
  if (1==2)
    boolvar = false;
  else {
    boolvar = true;
    showSaveMsg();
  }

if(boolvar)setTimeout("document.aspnetForm.submit();",3000);
  return false;
}

function showSaveMsg() {
  ssm1=document.createElement("span");
  ssm1.style.position="absolute";
  ssm1.style.left="0px";
  ssm1.style.top="0px";
  ssm1.style.height="100%";
  ssm1.style.background="#fff";
  ssm2=document.createTextNode("Data behandles");
  ssm1.appendChild(ssm2);
  document.body.appendChild(ssm1);
}
</script>
<form name="aspnetForm" method="post" action="test.html" onsubmit="return send();" id="aspnetForm">
<input type="submit" value="send">
</form>
</body>
</html>
Avatar billede olebole Juniormester
31. maj 2006 - 13:02 #8
<ole>

Når en form submittes, går der et sideskift igang - hvorved man i realiteten forlader dokumentet. Mon ikke dette skulle virke:

<script type="text/JavaScript">
function mySubmit(f) {
    document.getElementById("msg").style.visibility = "visible";
    setTimeout(function(){f.submit()}, 10);
}
</script>

<div id="msg" style="visibility:hidden">Sender ...</div>

<form ........... onsubmit="mySubmit(this);return false">

/mvh
</bole>
Avatar billede olebole Juniormester
31. maj 2006 - 13:03 #9
- og fidusen i den løsning er, at onsubmit-event'en ikke afvikles, når formen submittes via JS  ;o)
Avatar billede trumf Nybegynder
31. maj 2006 - 13:11 #10
mclemens>
jeg kan godt rette i koden, men ikke i den del, da det er ASP.NET, så kan man kun tilføje en event til formen.

Dit forslag virker fint når jeg tester det alene, men når der kommer ind i min .net form, så submitter den ikke på den rigtige måde...
Avatar billede trumf Nybegynder
31. maj 2006 - 13:15 #11
altså nu kommer der en besked i 3 sek. hvis formen valideres, men siden opdateres som i et autopostback bortset fra at dette ikke fanges i codebehind
Avatar billede trumf Nybegynder
31. maj 2006 - 13:21 #12
Hvis jeg ændrer:
if(boolvar)setTimeout("document.aspnetForm.submit();",3000);
  return false;

til

if(boolvar)setTimeout("document.aspnetForm.submit();",3000);
  return true;

submitter den "rigtigt", men beskeden kommer kun frem kort inden formen submittes...
Avatar billede trumf Nybegynder
31. maj 2006 - 13:32 #13
ole>
det virker heller ikke, da det er .NET og når jeg tilføjer eventen "send();return false;" til onsubmit på formen laver den selv koden:
onsubmit="java script:return WebForm_OnSubmit();"
<script type="text/javascript">
<!--
function WebForm_OnSubmit() {
send();return false;
return true;
}
// -->
</script>
Avatar billede mclemens Nybegynder
31. maj 2006 - 13:45 #14
[ - og fidusen i den løsning er, at onsubmit-event'en ikke afvikles, når formen submittes via JS  ;o) ] - jeps brugte også det trick i 31/05-2006 12:36:23
Avatar billede mclemens Nybegynder
31. maj 2006 - 13:49 #15
[ altså nu kommer der en besked i 3 sek. hvis formen valideres, men siden opdateres som i et autopostback bortset fra at dette ikke fanges i codebehind ]
- den "fangede" jeg ikke helt?

[ Hvis jeg ændrer: ]
... så kan du sikkert også bruge rette
if(boolvar)setTimeout("document.aspnetForm.submit();",3000);
  return true;

til
return true;

- men så skifter den og submitter med det samme - så afhængig af tiden destinationen er om at svare tager det kun den mængde tid ...

... kender ikke asp ...
Avatar billede trumf Nybegynder
31. maj 2006 - 13:56 #16
Hvis jeg ændrer return false til true submitter den, således at codebehind (.cs filen i C#) fanger postbacket, hvis jeg ikke ændrer det, fanger cs filen ikke postbacket og siden genindlæses bare med det samme....

Jeg mener at problemet med setTimeout er løst, så får jeg ikke et svar mclemens.
Jeg opretter et nyt spm til det med postbacket i et .NET forum, for det er noget helt andet.

mange tak for hjælpen :)
Avatar billede mclemens Nybegynder
31. maj 2006 - 14:00 #17
- det var så lidt :)
her er et svar :)
Avatar billede mclemens Nybegynder
31. maj 2006 - 14:07 #18
- og tak for point :)
Avatar billede olebole Juniormester
31. maj 2006 - 15:16 #19
Hvis .NET virkelig skriver:
    onsubmit="java script:return WebForm_OnSubmit();"

- er det en klar fejl. Det er noget lodret vrøvl at bruge JavaScript pseudo-protokollen i en event-handler. Det er altid noget skidt, når man ikke selv har styr over koden  ;o)
Avatar billede trumf Nybegynder
31. maj 2006 - 15:45 #20
Det har du ret i, men det gør det altså og jeg kan desværre ikke gøre noget ved...
Avatar billede trumf Nybegynder
31. maj 2006 - 15:47 #21
Denne kode:
ClientScript.RegisterOnSubmitStatement(typeof(string), "onSubmit", "return send()");

bygger denne kode:
onsubmit="java script:return WebForm_OnSubmit();"
og
<script type="text/javascript">
<!--
function WebForm_OnSubmit() {
return send();
return true;
}
// -->
</script>
Avatar billede olebole Juniormester
31. maj 2006 - 19:56 #22
Hmmmm ... så kan du bare skrive:

function send() {
    var f = document.getElementsByTagName("aspnetForm")[0];
    document.getElementById("msg").style.visibility = "visible";
    setTimeout(function(){f.submit()}, 10);
    return false;
}

- så virker det ... på trods af .NET's grimme og invalide kode  =)
Avatar billede mclemens Nybegynder
31. maj 2006 - 20:55 #23
olebole, vi laver lige et splitter her...

- Jeg foreslår, du bruger olebole's visibility aktivering istedet for at oprette elementet ved submit, som jeg gjorde i 31/05-2006 12:36:23 (det jeg lavede med appending er lidt for omstændeligt) ...

Det er meget bedrer at man har oprettet elementet i documentet ( stylet i css og med display:hidden; eller visibility:hidden; ), og så blot viser det...

- Herefter document.getElementById("msg").style.visibility = "visible"; eller document.getElementById("msg").style.display = "block"; afhængig af ovenstående valg .
Avatar billede mclemens Nybegynder
31. maj 2006 - 21:03 #24
Avatar billede mclemens Nybegynder
31. maj 2006 - 21:20 #25
P.s.: Regner med at denne forkortelse er
ligeså god - ellers så ret mig lige Olebole :)

function send() {
    document.getElementById("msg").style.visibility = "visible";
    setTimeout("document.aspnetForm.submit();",10);
    return false;
}
Avatar billede olebole Juniormester
02. juni 2006 - 18:11 #26
Den er ikke dårlig ... den er faktisk langt bedre. I min skulle der have stået:
    var f = document.getElementsByName("aspnetForm")[0];

- hvis den skulle fungere. My bad!  :D
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