Discussion:
Formular verzögert absenden
(zu alt für eine Antwort)
Hubert Holler
2006-05-18 14:46:35 UTC
Permalink
Ist es in einem html Form irgendwie möglich ein verzögertes Absenden
einzubauen.

Ich habe folgendes ausprobiert:
<form name="einsatz" action="<? echo $_SERVER['PHP_SELF']; ?>"
onSubmit="return countdown();">
<input type="submit" value="Weiter">
</form>

---------------
Javascript Funktion
------------

var timer = 0;
function countdown()
{
if(timer <=3)
{
if (timer >1) inhalt.innerHTML = "";
timer++;
anzeige.innerHTML = timer;
setTimeout("countdown()",1000);
}
else
{
return true; //Formular wird abgeschickt.
}
}
----------

Leider funktioniert dies aber nicht. Das Formular wird sofort abgesendet.
Vielen Dank für jede Antwort
Hubert
Martin Honnen
2006-05-18 14:53:19 UTC
Permalink
Post by Hubert Holler
Ist es in einem html Form irgendwie möglich ein verzögertes Absenden
einzubauen.
Warum willst du das Absenden verzoegern?
Post by Hubert Holler
<form name="einsatz" action="<? echo $_SERVER['PHP_SELF']; ?>"
onSubmit="return countdown();">
onsubmit="return delaySubmit(this, 3000);"


function delaySubmit (form, delayInMilliseconds) {
setTimeout(function () { form.submit(); }, delayInMilliseconds);
return false;
}
--
Martin Honnen
http://JavaScript.FAQTs.com/
Hubert Holler
2006-05-18 20:32:12 UTC
Permalink
Post by Martin Honnen
Post by Hubert Holler
Ist es in einem html Form irgendwie möglich ein verzögertes Absenden
einzubauen.
Warum willst du das Absenden verzoegern?
Es geht um eine Live-Wette und da möchte ich dass der abgegebene Tip nicht
sofort durchgeführt wird.

[...]

Danke für die Funktion, hat wunderbar funktioniert. Gibt es irgendwie noch
die Möglichkeit, dass man nun die Sekunden in einem Feld hochzählen kann,
solange noch die Zeit läuft.

Ich habe da mal folgendes versucht:

function delaySubmit (form, delayInMilliseconds) {
setTimeout(function () { form.submit(); }, delayInMilliseconds);
timer++;
anzeige.innerHTML = timer;
return false;
}

Das Problem dabei ist nur, dass nur 1 angezeigt wird und nicht hochgezählt
wird.

Hoffe da gibt es noch eine Idee dazu.
Vielen Dank für jede Antwort.
Hubert
Thomas 'PointedEars' Lahn
2006-05-19 09:35:08 UTC
Permalink
Hubert Holler wrote:

Wer hat das geschrieben?
<URL:http://lernst.de/zitieren/kriegst.de/antworten/>
vvvvvvvvvvvvvvvvvvvvvvvv
Post by Martin Honnen
Post by Hubert Holler
Ist es in einem html Form irgendwie möglich ein verzögertes Absenden
einzubauen.
Warum willst du das Absenden verzoegern?
[Grund: Live-Wette] Gibt es irgendwie noch die Möglichkeit, dass man nun
die Sekunden in einem Feld hochzählen kann, solange noch die Zeit läuft.
function delaySubmit (form, delayInMilliseconds) {
setTimeout(function () { form.submit(); }, delayInMilliseconds);
timer++;
anzeige.innerHTML = timer;
return false;
}
Das Problem dabei ist nur, dass nur 1 angezeigt wird und nicht hochgezählt
wird.
Deine Programmlogik ist fhcsla. delaySubmit() wird nur _einmal_ aufgerufen,
also wird `timer' auch nur einmal inkrementiert.

Ausserdem benutzt Du wahrscheinlich `anzeige' als name oder
ID eines Elements; nur IE macht die Sprachbasis dahingehend kapott, dass
er aus diesen Namen Eigenschaften eines global verfügbaren Host-Objekts
macht, welche die entsprechenden Elementobjekte referenzieren. Für
maximale Kompatibilitität benutzt Du stattdessen ein standardkonform
referenziertes Formularelement-Objekt. Zusammenfassender Quickhack:

<head>
...
<meta http-equiv="Content-Script-Type" content="text/javascript">
<script type="text/javascript">
// from types.js
function isMethod()
{
for (var i = 0, len = arguments.length; i < len; i++)
{
var a = arguments[i];

if (!(a && /\s*(function|object)\s*/.test(typeof a)))
{
return false;
}
}

return true;
}

function delaySubmit(f, intv_len, max_time, sControlName)
{
if (isMethod(window.setInterval, window.clearInterval))
{
var oControl = null;
if (!(sControlName && (oControl = f[sControlName])
&& typeof oControl.value != "undefined"))
{
oControl = null;
}

var intv = window.setInterval(
function()
{
var me = arguments.callee;
if (typeof me.timer == "undefined")
{
me.timer = intv_len;
}
else
{
me.timer += intv_len;
}

if (oControl)
{
oControl.value = me.timer;
}

if (me.timer >= max_time)
{
window.clearInterval(intv);
f.submit();
}
},
intv_len);

return false;
}

return true;
}
</script>
...
</head>

<body>
<h1>Live-Wette</h1>
<form action=""
onsubmit="return delaySubmit(this, 1000, 3000, 'anzeige');">
<input type="submit" value="absenden"> <input name="anzeige">
</form>
</body>

Dein Ansatz ist aber bereits falhcs. Das Absenden wird nämlich nicht
verzögert, wenn beim Benutzer clientseitiger Script-Support oder die
entsprechende AOM-Methode nicht unterstützt wird. Du musst also das
Wettgebot sofort absenden lassen und _serverseitig_ speichern, wann
sie abgegeben wurde.


PointedEars

Loading...