PDA

Ver la Versión Completa : Reset y submit en un botón


elcigarra
10-12-2006, 02:57:28
Amigos, tengo un formulario que pasa a una página php que "hace cosas" y manda un saludo... bueno, clásico.

El caso es que muchos de los visitantes de mi página repiten (envían) el formulario más de una vez. Le dije a un amigo que probara esa parte del sitio y me comentó que después del saludo fue a la página anterior (la del formulario) y como estaban todos los datos que el había puesto, por un momento le quedó la duda de si el formulario se había mandado efectivamente.

¿Hay alguna forma de que antes de enviarse, el formulario se resetee?. Algo como poner un boton de Reset y Submit al mismo tiempo.

JavierB
10-12-2006, 11:45:54
Hola elcigarra

Tienes dos posibilidades, utilizar un botón normal de esta forma:

<input type="button" value="Enviar" onclick="this.form.submit(); this.form.reset()" />

o dehabilitar el botón submit para que no se pueda volver a pulsar:

<input type="submit" onclick="this.disabled=true" />

Saludos, :adios:

kayetano
11-12-2006, 14:52:24
Hola

Tienes dos posibilidades, utilizar un botón normal de esta forma:

<input type="button" value="Enviar" onclick="this.form.submit(); this.form.reset()" />
No lo he probado pero no parece una solución válida, me parece que enviará un formulario vacio.

o dehabilitar el botón submit para que no se pueda volver a pulsar:

<input type="submit" onclick="this.disabled=true" />
Tampoco tengo claro que esto funcione, ya que tu problema es al volver y no se si el estado del boton permanecerá desactivado.

La solución que yo te propongo es más complicada que estas dos y no la he probado por lo que no se si funcionará:
La idea es hacer tantos INPUTs ocultos como INPUTs visibles hayan, una vez se pulsa el botón de enviar y con javascript copias el contenido de los inputs visibles en los inputs ocultos, borras el contenido de los inputs visibles y envias el formulario.

dec
11-12-2006, 19:04:12
Hola,

Pues luego de probar con varias cosas, por ejemplo tratar de que la página del formulario no fuera guardada en el caché del navegador... sin resultado, se me ocurrió una solución que acaso no sea muy elegante, pero, en fin, parecía funcionar... como no podía ser de otro modo:


<script type="text/javascript">

function LimpiarFormulario(idFormulario) {
return;
frm = document.getElementById(idFormulario);
if(frm) {
for (i = 0; i < frm.elements.length; i++) {
if(frm.elements[i].type === 'text')
frm.elements[i].value = '';
}
return true;
}
return false;
}

</script>


Efectivamente, ejecutar la función "LimpiarFormulario" cada que se cargara la página Web: utilizando el evento "OnLoad" de "BODY".

Pero, resulta que probé después lo que el compañero JavierB propone, esto es, algo así:


<input type="button" onclick="this.form.submit(); this.form.reset();" value="Enviar" />


Y la cosa también parece funcionar como se espera. He hecho pruebas y los datos del formulario se envían pero este se "resetea" al cabo.

roman
11-12-2006, 19:40:19
Yo acabo de probar esta opción y me envía correctamente el formulario, pero al darle al botón BACK, ahí siguen los datos...

... en IE, porque en FF sí desaparecen.

// Saludos

dec
11-12-2006, 19:43:17
Hola,

Pues toma ya... así es la verdad que sólo probé el asunto en Firefox... mal hecho, puesto que no hubiera funcionado en Internet Explorer (¿Entre cuántos más?)... gracias Román. Y en todo caso, ¿qué nos queda? ¿Recorrer los controles del formulario y borrar el contenido de las casillas de texto?

Acaso también pudiera controlarse mediante una variable "de sesión" que el mismo usuario no enviara el formulario más de dos veces en la misma sesión... guardando en la variable de sesión su IP, por ejemplo... es lo que se me ha ocurrido al principio también, pero, al final no seguí por ese camino.

roman
11-12-2006, 19:45:07
dec, ¿qué LimpiarFormulario no podría simplificarse así?


function LimpiarFormulario(idFormulario)
{
frm = document.getElementById(idFormulario);
if (frm)
{
frm.reset();
}
}


// Saludos

dec
11-12-2006, 19:53:10
Hola,

Pues si lo has probado y funciona no sólo podía sino que debía hacerse así. Un formulario puede contener otros controles distintos de las casillas de texto (pienso en los "CheckBox", por ejemplo) que también precisen ser "reiniciados" convenientemente. Desde luego no se me ocurrió antes pero si funciona ya digo que me parece que debe hacerse como dices Román. ;)

roman
11-12-2006, 19:59:34
Una cosa que nunca he terminado de entender es esta:


<?
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
print '<pre>';
print_r($_POST);
print '</pre>';

exit();
}
?>
<form method='post' action='<?=$_SERVER['PHP_SELF']?>' name='form'>
<input type='text' name='nombre'>
<input type='submit'>
</form>


Puesto tal cual, sucede lo que se describió desde un principio. Sin embargo, si agregamos session_start() al principio, entonces los datos del formulario se borran al regresar a él. Esto he notado yo desde siempre aunque la verdad nunca me he puesto a ver qué es lo que ocurre.

Ahora, un poco al margen (o no) de esto, lograr que se borre el formulario no siempre es lo deseado. Digo, pocas cosas me fastidian tanto como llenar un formulario, darle OK, recibir un mensaje de tipo: "falta un dato", regresar, y tener que escribir todo de vuelta.

// Saludos

dec
11-12-2006, 20:06:19
Hola,

Nada que decir.

Sólo en relación al "$_SERVER['PHP_SELF']" porque lo tengo reciente y por si puede servirle a alguien: revisen este artículo (en inglés) (http://blog.phpdoc.info/archives/13-XSS-Woes.html).

roman
11-12-2006, 20:13:59
Creo que lo conveniente sería que abrieras un hilo distinto y comentaras al respecto, porque si no nos desviamos del tema principal.

// Saludos

roman
11-12-2006, 20:14:09
Creo que lo conveniente sería que abrieras un hilo distinto y comentaras al respecto, porque si no nos desviamos del tema principal.

// Saludos

dec
11-12-2006, 20:28:26
Hola,


Creo que lo conveniente sería que abrieras un hilo distinto y comentaras al respecto, porque si no nos desviamos del tema principal.


¿Eso va por mí? ¿Por el enlace que he puesto arriba al artículo? No pretendía yo desviar el tema... Sé que no es lo mismo, pero, al fin y al cabo introdujiste tú el "PHP_SELF". A mí se me encendió la bombilla porque hacía poco que había andado con este tema: así que no me pareció mal dejar un enlace en donde se explica la problemática del "PHP_SELF". La verdad, no creí necesario un nuevo Hilo para esto... sólo quería anotar algo al respecto de "PHP_SELF"...

roman
11-12-2006, 20:35:13
Pues no. De hecho yo no introduje el PHP_SELF, como tampoco la palabra input, post o action, todas las cuales aparecen en mi mensaje pero sólo de manera totalmente lateral.

dec
11-12-2006, 20:42:18
Hola,

Román, yo no dije que introdujeras el "PHP_SELF" en este tema por este tema. Pero en tu código apareció el "PHP_SELF" y yo me acordé entonces de lo que había leído sobre ello hace apenas un par de días. Es por esto que enlazé al artículo en cuestión, por si alguien más pudiera estar interesado. Nada más. ¿Que debí abrir un Hilo nuevo para comentarlo? Tal vez. Pero yo creo que no era necesario.

JavierB
11-12-2006, 21:35:35
HPues toma ya... así es la verdad que sólo probé el asunto en Firefox... mal hecho, puesto que no hubiera funcionado en Internet Explorer

Lo mismo me pasó a mí, probé los dos códigos en Firefox y me puse tan contento pensando que funcionaba bien :(

He probado alguna cosa más, pero el puñetero Explorer sigue sin hacerme caso :confused:

Saludos, :cool:

roman
11-12-2006, 22:04:31
Siguiendo con las pruebas, veo que lo que comenté de session_start() sólo es válido en IE. Ahora,fijándome en los encabezados que se mandan cuando se usan sesiones, parece que podemos combinar ambas técnicas:


<?
header("Cache-Control: no-cache, must-revalidate");

if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
print '<pre>';
print_r($_POST);
print '</pre>';

exit();
}
?>
<form method='post' action='<?=$_SERVER['PHP_SELF']?>' name='form'>
<input type='text' name='nombre'>
<input type='button' value='Enviar' onclick='this.form.submit(); this.form.reset();'>
</form>


Probado en IE, FF y Opera.

// Saludos

elcigarra
12-12-2006, 03:01:02
Amigos, tal vez sea la solución más tonta pero luego de lo de kayetano probé su opción y, es cierto, cuando uno pone back las letras escritas vuelven a estar. Me perdí toda esta discusión ya que cuando me pasó eso simplemente abró la página de saludo en un _blank. De esa forma no había como poner "back". El señor solo cerraba la página de saludo y le quedaba la anterior con el formulario vacío.

Gracias a todos

roman
12-12-2006, 03:25:26
No entendí. ¿La solución fue mostrar el saludo en una ventana nueva? En tal caso, ¿como hiciste para que al cerrarla se borraran los campos del formulario? ¿Podrías explicar?

// Saludos

elcigarra
12-12-2006, 03:45:26
En la definición del formulario:
<form id="form1" name="form1" method="post" action="env_carta.php" target="_blank">

y en el botón enviar:
<input type="button" value="Enviar" onclick="this.form.submit(); this.form.reset()" />

incluso si luego de la página del formulario vuelven atrás se vá de la misma, no va al formulario lleno.

Lo pueden ver funcionando en mi sitio:
http://www.clubdeturistas.com.uy/navidad/navidad.php
y de paso si tienen niños chicos le pueden mandar una cartita a papá noel :) (o Santa Claus, o otra infinidad de nombres)