Da denkt man sich schon mal eine tolle Methode aus, wie man sicherstellen kann, dass ein Anwender auch bei langsamer Internetverbindung nur einmal auf den Absende-Button eines Formulars klicken kann ... und dann klappt das natürlich nicht in jedem Webbrowser. Typisch.
In diesem Fall hat Google Chrome keine Lust, wie auch Apple Safari -- vermutlich alle Browser, die auf der Apple-Webkit-Engine basieren.
Wird ein Formular via JavaScript-Funktion form.submit() abgeschickt (z.B. weil man <button onclick="..."> statt <input type="submit"> verwendet), dann funktioniert das nicht mit Formularen vom Typ method="post", sondern nur mit method="get". Das ist insbesondere bei Formularen mit größerer Datenmenge oder Dateianhängen eine erhebliche Einschränkung, weil ja gerade beim Hochladen größerer Datenmengen das mehrfache Betätigen während des Hochladens zu vermeiden wäre.
Beispiel:
<?php
$method = "post"; # "get" / "post"
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; iso-8859-1">
<style type="text/css">
body, input, button, textarea, p, td, th
{
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10pt;
}
</style>
<script language="JavaScript" type="text/javascript">
function activateForm()
{
var input_field = document.forms.testform.input_field;
if(input_field)
{
input_field.focus();
input_field.select();
}
}
function disableSend()
{
var submit_btn = document.forms.testform.submit_btn;
if(submit_btn)
{
submit_btn.innerHTML = "Submitting, please wait...";
submit_btn.disabled = true;
}
}
function safeSend()
{
disableSend();
document.forms.testform.submit();
}
</script>
</head>
<body onload="activateForm();">
<form name="testform" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="<?php echo $method; ?>" enctype="text/html">
<input type="text" id="input_field" name="input_field" value="<?php echo $_REQUEST['input_field']; ?>">
<button type="button" id="submit_btn" onclick="safeSend();">Click <b><i>only once</i></b> to submit</button>
</form>
<hr>
<p>Previously submitted:</p>
<pre>
<?php
echo '$_GET = '.var_export($_GET, true)."\r\n\r\n";
echo '$_POST = '.var_export($_POST, true)."\r\n\r\n";
echo '$_SESSION = '.var_export($_SESSION, true)."\r\n\r\n";
echo '$_REQUEST = '.var_export($_REQUEST, true)."\r\n\r\n";
?>
</pre>
</body>
</html>
Alles anzeigen
Im Anhang - Reaktionen von
- Google Chrome 2.0.172.30
- Apple Safari 3.2.3
- Mozilla Firefox 3.0.10
- Opera 9.64
- Microsoft Internet Explorer 7.0.5730.11
Bei Methode "get" arbeiten alle wie erwartet.
___
P.S. -- :redface: Kaum gemeldet, schon die Ursache und Lösung gefunden:
Alle anderen Webbrowser senden das Formular zumindest noch so weit ab, wie es der MIME-Typ "text/html" zuläßt. Anhänge sind damit nicht möglich.
Webkit jedoch verweigert offenbar schon das Absenden insgesamt, wenn für das Formular bei method="post" nicht auch gleichzeitig enctype="application/x-www-form-urlencoded" festgelegt wurde!
Mit diesem MIME-Typ klappt das Versenden von POST-Formularen auch in Chrome und Safari.