Extraño comportamiento de reset
Tengo un problema al resetear un formulario, y ni siquiera entiendo el comportamiento que sucede. Te explico.
Tengo un form con unos campos donde uno de ellos está definido como
public class ModificacionDatosUsuarioForm extends ValidatorForm {
private boolean js;
....................
En la jsp tengo escrito esto:
<head>
<html:javascript formName="modificacionDatosUsuarioForm"/>
<script language="JavaScript">
// Inicialización
function restablecer() {
alert (document.modificacionDatosUsuarioForm.js.value);
document.modificacionDatosUsuarioForm.js.value = true;
document.modificacionDatosUsuarioForm.conf.value = "";
document.modificacionDatosUsuarioForm.conf.disabled = true;
alert (document.modificacionDatosUsuarioForm.js.value);
}
// Comprobación de valor de campo (función sólo de prueba)
function comprobar() {
alert (document.modificacionDatosUsuarioForm.js.value);
}
</script>
</head>
<body onload="restablecer();">
<%-- Si javascript está deshabilitado, muestro mensaje --%>
<logic:messagesPresent message="true" property="jsError">
<div class="centrar">
<html:messages id="msgJs" message="true" property="jsError" header="errors.header" footer="errors.footer">
<bean:write name="msgJs"/>
</html:messages>
</div>
</logic:messagesPresent>
<html:errors/>
<html:form action="/modificarDatosUsuario" method="POST" onsubmit="return validateModificacionDatosUsuarioForm(this);" onreset="restablecer();">
<div class="centrar">
<table class="formulario" height="360">
<tr>
<td>
<table width="100%">
<tr>
<td width="10%" height="50"> </td>
<td width="23%" height="50"> </td>
<td width="67%" height="50">
<html:hidden property="js" value="false"/>
................
<table width="100%">
<tr>
<td width="33%" height="100">
<div class="centrar">
<html:submit onclick="comprobar();">
<bean:message key="button.submit"/>
</html:submit>
</div>
</td>
<td width="33%" height="100">
<div class="centrar">
<html:reset>
<bean:message key="button.reset"/>
</html:reset>
</div>
</td>
<td width="33%" height="100">
<div class="centrar">
<html:cancel>
<bean:message key="button.cancel"/>
</html:cancel>
</div>
</td>
</tr>
</table>
...
Vamos a ver! La idea de todo esto es que el campo "js" sea oculto y de inicio con valor false, y que al cargar la página se ejecute el javascript "restablecer()", que es la función que pone los valores por defecto que yo deseo y donde "js" lo pongo ya a true. El comportamiento según las salidas de alert hasta ahí es correcto: primero muestra false y después true. Si se pulsa entonces aceptar no hay ningún problema, puesto que el alert de "comprobar()" sigue mostrando true para el valor de "js" y se va a la action correspondiente donde se ejecuta su lógica.
El problema ocurre cuando le doy al reset, donde se ejecuta de nuevo "restablecer()" con idéntica salida, pero al pulsar entonces aceptar, la salida de "comprobar()" no sé por qué ahora es false para "js" (cuando previamente acababa de ser true y no hago nada más). Se va a la action, y de ahí se retorna de nuevo a la jsp porque el valor de "js" es false y ese es el comportamiento adecuado en ese caso. Se mostraría un mensaje de error a través de html:errors (el mensaje de logic:messagesPresent)
Tengo un form con unos campos donde uno de ellos está definido como
public class ModificacionDatosUsuarioForm extends ValidatorForm {
private boolean js;
....................
En la jsp tengo escrito esto:
<head>
<html:javascript formName="modificacionDatosUsuarioForm"/>
<script language="JavaScript">
// Inicialización
function restablecer() {
alert (document.modificacionDatosUsuarioForm.js.value);
document.modificacionDatosUsuarioForm.js.value = true;
document.modificacionDatosUsuarioForm.conf.value = "";
document.modificacionDatosUsuarioForm.conf.disabled = true;
alert (document.modificacionDatosUsuarioForm.js.value);
}
// Comprobación de valor de campo (función sólo de prueba)
function comprobar() {
alert (document.modificacionDatosUsuarioForm.js.value);
}
</script>
</head>
<body onload="restablecer();">
<%-- Si javascript está deshabilitado, muestro mensaje --%>
<logic:messagesPresent message="true" property="jsError">
<div class="centrar">
<html:messages id="msgJs" message="true" property="jsError" header="errors.header" footer="errors.footer">
<bean:write name="msgJs"/>
</html:messages>
</div>
</logic:messagesPresent>
<html:errors/>
<html:form action="/modificarDatosUsuario" method="POST" onsubmit="return validateModificacionDatosUsuarioForm(this);" onreset="restablecer();">
<div class="centrar">
<table class="formulario" height="360">
<tr>
<td>
<table width="100%">
<tr>
<td width="10%" height="50"> </td>
<td width="23%" height="50"> </td>
<td width="67%" height="50">
<html:hidden property="js" value="false"/>
................
<table width="100%">
<tr>
<td width="33%" height="100">
<div class="centrar">
<html:submit onclick="comprobar();">
<bean:message key="button.submit"/>
</html:submit>
</div>
</td>
<td width="33%" height="100">
<div class="centrar">
<html:reset>
<bean:message key="button.reset"/>
</html:reset>
</div>
</td>
<td width="33%" height="100">
<div class="centrar">
<html:cancel>
<bean:message key="button.cancel"/>
</html:cancel>
</div>
</td>
</tr>
</table>
...
Vamos a ver! La idea de todo esto es que el campo "js" sea oculto y de inicio con valor false, y que al cargar la página se ejecute el javascript "restablecer()", que es la función que pone los valores por defecto que yo deseo y donde "js" lo pongo ya a true. El comportamiento según las salidas de alert hasta ahí es correcto: primero muestra false y después true. Si se pulsa entonces aceptar no hay ningún problema, puesto que el alert de "comprobar()" sigue mostrando true para el valor de "js" y se va a la action correspondiente donde se ejecuta su lógica.
El problema ocurre cuando le doy al reset, donde se ejecuta de nuevo "restablecer()" con idéntica salida, pero al pulsar entonces aceptar, la salida de "comprobar()" no sé por qué ahora es false para "js" (cuando previamente acababa de ser true y no hago nada más). Se va a la action, y de ahí se retorna de nuevo a la jsp porque el valor de "js" es false y ese es el comportamiento adecuado en ese caso. Se mostraría un mensaje de error a través de html:errors (el mensaje de logic:messagesPresent)
2 Respuestas
Respuesta de rpbviso
1
Respuesta de dev_java_eve
1