[ajax] nielogiczne zachowanie formularza

0

pliki:

form.html

	<p class="para">Czekam na pytania, uwagi, sugestie dot. strony i Isengard.
	
	<form action="send.php" method="post" id ="the_form">
		<table cellspacing="0" cellpadding="1" border="0" align="center" width="95%">
		<tr>
			<td width="20%" valign="bottom" nowrap>
				<p align="right" class="para">temat:</p>
			</td>
			<td width="80%" align="left">
				<input type="text" size="30" maxlength="50" name="temat" style="width:200px;">
			</td>
		</tr>
		<tr>
			<td width="20%" valign="bottom" nowrap>
				<p align="right" class="para">e-mail nadawcy:</p>
			</td>
			<td width="80%" align="left">
				<input type="text" size="30" maxlength="50" name="email" style="width:200px;">
			</td>
		</tr>
		<tr>
			<td width="20%" valign="bottom" nowrap class="underline">
				<p align="right" class="para">treść wiadomości:<br><br><br><br><br><br><br><br><br><br></p>
			</td>
			<td width="80%" align="left" class="underline">
				<textarea name="tresc" style="width:431px; " rows="10" cols="50"></textarea>
			</td>
		</tr>
		<tr>
			<td align="center" colspan="2">
			<input type="submit" name="submit" value="wyślij" /> <INPUT TYPE="reset" VALUE="wyczyść">
			</td>
		</tr>
		</table>
	</form>

mail.php:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>

	<head>
	<meta http-equiv="Content-Language" content="pl">
	<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-2">
	<link rel="stylesheet" href="style.css" type="text/css">
	<title>kontakt via e-mail</title>
	
	
	<script type="text/javascript" src="advajax.js"></script>
	
	<script type="text/javascript">
	function sprawdz() {
		advAJAX.assign(document.getElementById("the_form"), {
	
			onSuccess : function(obj) {
				var element = document.getElementById("wynik");
				element.innerHTML = obj.responseText;
			},
			headers : {
				"content-type" : "text/html; charset=iso-8859-2",
				"content-language" : "pl"
			}
		});
		
		return false;
	}
	</script>

</head>

<body bgcolor="black" onload="sprawdz()"><br>

<div id = "wynik">

	<?php include('form.html'); ?>

</div>

<p class="para" align="left">&nbsp;<a href="javascript:window.close();" class="genmed">Zamknij Okno</a></p>
</body>
</html>

send.php:

<?php


		header('Content-type: text/html; charset=iso-8859-2');

		#Pobieranie adresu IP
			$ip=$_SERVER['REMOTE_ADDR'];
		#Pobieranie serwera
			$host=gethostbyaddr($ip);
		#Pobieranie adresu strony
			$document=$_SERVER['HTTP_REFERER'];


		# temat
		if (empty($_POST['temat'])) {
			$te = FALSE;
			$message .= 'Zapomniałeś podać temat wiadomości.' . '<br />';
			$bg[1] = ' background-color: #C0C0C0; color: black';
		} else {
			$te = $_POST['temat'];
		}


		# e-mail
		if ( !(strstr($_POST['email'], '@')) || strlen($_POST['email'])<6 ) {
			$em = FALSE;
			$message .= 'Popraw swój adres e-mail.' . '<br />';
			$bg[2] = ' background-color: #C0C0C0; color: black';
		} else {
			$em = $_POST['email'];
		}


		# tresc
		if (empty($_POST['tresc'])) {
			$tr = FALSE;
			$message .= 'Zapomniałeś podać treść wiadomości.' . '<br />';
			$bg[3] = ' background-color: #C0C0C0; color: black';
		} else {
			$tr = $_POST['tresc'];
		}


			if ($te && $em && $tr) {

							$wiadomosc = "
	Wiadomość od $em: <br/><br/>

	$tr <br/><br/>

	-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- <br/>
	IP nadawcy: $ip <br/>
	HOST nadawcy: $host <br/>
	wys?ano z: $document <br/>
	";

					$naglowki = "MIME-Version: 1.0\r\n";
					$naglowki .= "Content-type: text/html; charset=iso-8859-2\r\n";
					$naglowki .= "From: $em\r\n";

				if ( mail('[email protected]',$te,$wiadomosc,$naglowki) ) {
					echo '<div align="center"><p class="para"><b>Wiadomość wysłana.</b></p></div>';
					exit();
					
				} else { echo 'Wiadomość nie mogła zostać wysłana z przyczyn technicznych.'; }

			} else {
				echo '<div align="center"><p class="error">';
					if (isset($message)) {
						echo $message;
					}
				echo '<br /><b>Spróbuj jeszcze raz.</b>';
				echo '</p></div>';
				include('form.html');
		}
	
	
?>

problem polega na tym że przy pierwszym wpisanu niepoprawnych danych (np wszystkie pola puste) pokazuje prawidlowo i komunikaty czerwone i formularz do poprawienia. Niestety jak znow wcisne 'wyslij' znow z niepoprawnymi (np pustymi) danymi to strona sie przeladuje ale juz nie zaladuje poczatku html i konca tylko sam formularz z komunikatami...

link:
http://kolos.math.uni.lodz.pl/~bart/isen/mail.php

dlaczego tak się dzieje i jak sprawic zeby zawsze pokazywalo sie tak jak za pierwszym nieudanym wypelnieniem?

prosze o pomoc

0

Jak ładujesz stronę, to w onload wykonuje się funkcja sprawdz(). Ta funkcja robi coś takiego, że naciśnięcie submit nie wysyła formy, ale wywołuje funkcję, która przesyła dane do serwera. W odpowiedzi otrzymujesz coś, co ładujesz zamiast formularza, czyli komunikat i niby ten sam formularz. Ale po przeładowaniu guzik submit już nie jest taki magiczny i po wciśnięciu wysyła formularz pod adres wskazany w akcji, bez wywołania żadnej funkcji javascriptowej. Dalej, to już normalnie, wyświetla się to, co zostało zwrócone.
Żeby to tak działało funkcja sprawdź musi się znów wywołać po otrzymaniu odpowiedzi z responseText.

0

Żeby to tak działało funkcja sprawdź musi się znów wywołać po otrzymaniu odpowiedzi z responseText.

dzieki, korzystam z advAJAX bo póki co jestem w tym zielony, co świadczy o tym że otrzymano odpowiedz z responseText i jak to dopisać (prosze o chociaz podpowiedz) dzieki z gory

0

Po przesłaniu formularza za pierwszym razem, dostajesz z powrotem cały formularz. Podmieniasz go, ale submit nie ma przypisanego zdarzenia onclick w javascript. Więc kod JS się nie wykonuje - nastepuje normalne wysłanie formularza.
Musisz dodać zdarzenie dla submita po każdym przeładowaniu zawartości formularza
LUB
Wyświetlać tylko błąd/info o powodzeniu+ukrywać formularz do wysyłania.

0

[quote]Musisz dodać zdarzenie dla submita po każdym przeładowaniu zawartości formularza [/quote] hmm a nie wystarczy moze zmiana

<input type="submit" name="submit" value="wyślij" onclick="sprawdz()"/>

? i dlaczego nie?

0

Powinno wystarczyć.

0

jest gorzej niz bylo bo onclick okazuje sie byc dla formularza wazniejsze niz onload i juz po pierwszym zlym wypelnieniu (nie jak dotad po drugim) dostaje biale tlo

link:
http://kolos.math.uni.lodz.pl/~bart/isen/mail.php

0
Firebug console napisał(a)

too much recursion
http://kolos.math.uni.lodz.pl/~bart/isen/advajax.js
Line 421

Dlatego skrypt jest przerywany i formularz jest normalnie wysyłany (bez ajax-a)

0

hmm niby racja, w koncu onclick po kliknieciu wywola ta podstrone gdzie jest onload... ale przeciez taka rekurencja sie wywola tylko 2 razy i nie jest to 'too much'

0

Oj wywołuje się dużo więcej razy.

Spróbuj dodac zdarzenie dynamicznie po załadowaniu formularza ajaksem.

0

Spróbuj dodac zdarzenie dynamicznie po załadowaniu formularza ajaksem.

np alert?

1 użytkowników online, w tym zalogowanych: 0, gości: 1