czwartek, 25 września 2008

Błąd wysłania formularza

Ku pamięci...
Nazwa funkcji w JS nie może być taka sama jak id jakiegoś pola formularza.
FF sobie radzi, opera i m$ - nie.

Żeby nie być gołosłownym...
W pewnym projekcie zaistniała potrzeba użycia javascriptu do submitu formularza z uprzednim podmienieniem wartości pola hidden na wartość podaną jako parametr funkcji.
Czuję, że jak zwykle zakręciłem i nie wiadomo o co mi chodzi.
Do rzeczy więc.
Mamy sobie stronkę:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
<title>Form error</title>
<meta name="author" content="Kashub" />
</head>
<body >
<?
if(!empty($_POST)) {
echo '<pre>POST:<br />' . var_export($_POST, 1) . '</pre>';
}
?>
<form action="" method="post" id="updateWirtForm">
<script type="text/javascript">
function sru(avid) {
document.getElementById('sru').value = avid;
document.getElementById('updateWirtForm').submit();
}
</script>
<input type="hidden" name="sru" id="sru" value="" />
<a href="#" onclick="sru('1')"/>wyślij z podmianą hiddena</a>
</form>

</body>
</html>
Na pierwszy rzut oka nic szczególnego - po kliknięciu na link ma się ustawić wartość wpolu hidden i wysłać formularz.
W wyniku spodziewamy się czegoś takiego:
POST:
array (
'sru' => '1',
)

wyślij z podmianą hiddena

... i tak też się dzieje na Firefoksie.
Wszystko było by fajnie, ale spójrzmy co na to np. Opera:
JavaScript - http://localhost/f.php
Event thread: click
Error:

name: TypeError

message: Statement on line 1: The Object does not implement [[Call]]
Backtrace:
Line 1 of script

sru("1");
At unknown location

[statement source code not available]

Również pod m$ie zaawansowany debug wyświetlił niezwykle treściwą informację - "Błąd na stronie". Być może dało by się gdzieś doczytać komunikat, ale pod winkiem jakoś nie da się nic więcej :)

Rozwiązanie okazało się bardzo proste, ale nieco nieoczekiwane. Wystarczy zmienić albo nazwę funkcji w javascript albo id hiddena w formie.
Mam nadzieję, że zaoszczędzę komuś nieco czasu dzięki temu wpisowi :)

Brak komentarzy: