JavaScript - Ayuda con formulario, validar fechas y pasar datos por evento onsubmit

 
Vista:
sin imagen de perfil
Val: 5
Ha aumentado su posición en 28 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

Ayuda con formulario, validar fechas y pasar datos por evento onsubmit

Publicado por pedro (4 intervenciones) el 02/06/2017 13:48:55
Muy buenas.

Tengo un problemilla con mi código, el cual me compara un par de fechas y horas que estén en un input dentro de un formulario.

El funcionamiento que quiero es que cuando se pulsa el botón de envío quiero que me compare los casos:

Si fecha1 > fecha2 muestra un alert y no deja continuar el envió del formulario

Si fecha1 < fecha2 pasa a la siguiente función de compara horas

Si hora1 > hora2 muestra un alert y no deja continuar el envió del formulario

Si hora1 < hora2 envía los datos por POST(preferiblemente)

Pues bien, hasta el 3 caso me funciona bien, pero cuando intento incorporar el siguiente caso para que haga el envío de los datos del formulario. Todo se trastoca y aunque muestra los alerts, se envía el formulario, impidiendo que funcione el control de fechas y horas.

Aqui mi script:
Código:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<script>
 
function compararHora()
{
	var hora1 = document.getElementById("hora_inicio").value;
	var hora2 = document.getElementById("hora_final").value;
    var horaSep = hora1.split(':');
    var horaSep2 = hora2.split(':');
 
    if(horaSep > horaSep2){
 
		alert('estoy aqui');
		Alert.render('La <b>HORA FINAL</b> debe ser siempre <b>SUPERIOR</b> a la hora de inicio.');
 
    }
		else{
 
			alert('tras este alert pasa los datos de form');
			document.forms[formulario].submit();
 
		}
 
}
 
function compararFecha(fecha1,fecha2)
{
	var fecha1 = document.getElementById("fecha_inicio").value;
	var fecha2 = document.getElementById("fecha_final").value;
    var fechaSep = fecha1.split('-');
    var fechaSep2 = fecha2.split('-');
    var indicada = new Date(fechaSep[0],fechaSep[1]-1,fechaSep[2]);
    var indicada2 = new Date(fechaSep2[0],fechaSep2[1]-1,fechaSep2[2]);
    if(indicada > indicada2){
 
		Alert.render('La <b>FECHA FINAL</b> debe ser siempre <b>SUPERIOR</b> a la fecha de inicio.');
 
	}else{
			alert('hola');
			compararHora();
	}
 }
 
</script>

Y aqui el formulario:

1
2
3
4
5
6
7
8
9
10
11
12
<form id="formulario" name="formulario" action="accion.php" method="post" onsubmit="return compararFecha()" >
 
<input   id="fecha_inicio" name="fecha_inicio" value="" ><input  id="hora_inicio" name="hora_inicio" value="">
<input   id="fecha_final" name ="fecha_final" value="" ><input id="hora_final" name="hora_final" value="">
 
 
<label for="tags">Descripción: </label>
<input type="text" name="descripcion" id="descripcion" />
 
 
<input name="submit" type="submit" value="enviar">
</form>

Cabe decir que las fechas las recoge el input mediante otro script de un control datepicker. Y que pasar los datos los pasa bien. Pero se salta los alerts impidiendo que se ejecute el control de fechas. Vaya, no le da a los usuarios la posibilidad de darle a OK al alert y cambiar la fecha, simplemente le envía los datos directamente.

Tengo una media solución, al incluir

1
return false;
dentro de los if de las funciones y después de los alerts, me muestra solo el primer alert, de las fechas. El de las horas simplemente lo muestras, pero se lo salta, enviando los datos del formulario, y dejando escapar el onsubmit

Alguna idea?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de kip
Val: 553
Bronce
Ha aumentado 1 puesto en JavaScript (en relación al último mes)
Gráfica de JavaScript

Ayuda con formulario, validar fechas y pasar datos por evento onsubmit

Publicado por kip (107 intervenciones) el 03/06/2017 04:17:07
Hola, hay un par de formas de solucionar esto pero la mas facil que se me ocurre es usar el operador && en el atributo onsubmit del formulario y de esta forma evaluar los resultados de ambas funciones de comparacion, algo asi:

1
<form id="formulario" name="formulario" action="accion.php" method="post" onsubmit="return compararFecha() && compararHora()" >

Luego en las funciones simplemente retornare booleans (true o false), asi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function compararHora()
{
    var hora1 = document.getElementById("hora_inicio").value;
    var hora2 = document.getElementById("hora_final").value;
    var horaSep = hora1.split(':');
    var horaSep2 = hora2.split(':');
    if (horaSep > horaSep2) {
        alert('HORA 1 MAYOR HORA 2');
        return false;
    }
    return true;
}
 
function compararFecha()
{
    var fecha1 = document.getElementById("fecha_inicio").value;
    var fecha2 = document.getElementById("fecha_final").value;
    var indicada = new Date(fecha1);
    var indicada2 = new Date(fecha2);
    if(indicada.getTime() > indicada2.getTime()){
        alert('FECHA 1 MAYOR FECHA 2');
        return false;
    }
    return true;
 }

Si te fijas tambien cambie en la funcion compararFecha() elimine donde haces el split, que realmente no lo veo necesario si tu valor de fecha tiene el formato 'YYYY-MM-DD' que es un formato que acepta Javascript para el constructor del objeto Date y ademas tome los valores UNIX Time de ambos para compararlos con getTime() de esa forma tenemos un valor altamente confiable para evaluar.

https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Date/getTime

Ademas me parece interesante esto:

1
2
3
var horaSep = hora1.split(':');
    var horaSep2 = hora2.split(':');
    if (horaSep > horaSep2) {

Conviertes a un array cada hora y luego lo comparas y funciona !

Al parecer cuando haces la comparasion los elementos del array se convierten en un string unidos por ',' y es en base a este string que se hace la comparacion, tomando el valor de codigo del primer caracter para compararlo tambien con el codigo del primer caracter del otro string generado.

Por ejemplo si tenemos 20:00 y 19:00, al comparar tomara el codigo del primer caracter de ambos, lo podriamos simular asi:

1
alert('2'.charCodeAt() > '1'.charCodeAt());

El resultado de aquella comparacion es true, ya que el codigo del caracter 2 es 50 y el del 1 es 49.

Si tenemos por ejemplo 20:02 y 20:01 lo que sucedera es que ira tomando el valor de cada caracter en secuencia para compararlo y que se logre validar el tipo de comparasion que estas haciendo, es decir que cuando inicie tomara el codigo del numero 2 de ambos lados pero al ser valores iguales no los toma en cuenta (extraño comportamiento) y continua hasta hallar valores comparables y llega hasta los ultimos caracteres que son 1 y 2 y bueno ya sabemos que pasa entonces:

1
alert('20,03' > '20,02');

https://stackoverflow.com/questions/8328908/javascript-surprising-array-comparison
https://stackoverflow.com/questions/10198257/comparing-2-strings-alphabetically-for-sorting-purposes

Lo que yo te recomendaria es hacer uso del objeto Date para ambos casos, en el caso de hora podrias enviarle al constructor una fecha cualquiera y la hora ingresada algo asi:

1
2
3
4
5
6
7
8
9
10
11
12
function compararHora()
{
    var hora1 = document.getElementById("hora_inicio").value;
    var hora2 = document.getElementById("hora_final").value;
    var horaSep = new Date ('1970-01-01 ' + hora1);
    var horaSep2 = new Date ('1970-01-01 ' + hora2);
    if (horaSep.getTime() > horaSep2.getTime()) {
        alert('HORA 1 MAYOR HORA 2');
        return false;
    }
    return true;
}

De esa forma creo que tendras un mejor control, aunque la inicial me parece que podria funcionar sin problemas puede ser que en algun momento tengas un comportamiento extraño y no deseado (es una comparacion extraña).

Nos avisas si te funciono.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 5
Ha aumentado su posición en 28 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

Ayuda con formulario, validar fechas y pasar datos por evento onsubmit

Publicado por pedro (4 intervenciones) el 03/06/2017 18:46:03
Lamentablemente no funciona ninguna de las soluciones que me das.

Seguire intentandolo con otro tipo de eventos o combinarlos en onsubmit y onclick. Lo que no entiendo es que lo realiza correctamente, pero escapa de la funcion.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip
Val: 553
Bronce
Ha aumentado 1 puesto en JavaScript (en relación al último mes)
Gráfica de JavaScript

Ayuda con formulario, validar fechas y pasar datos por evento onsubmit

Publicado por kip (107 intervenciones) el 03/06/2017 19:17:53
Estas seguro que no funciona ? Yo lo he probado y me funciona bien, mira:

YTEcXwl

https://jsfiddle.net/e4jy9d6t/

No es aquello lo que deberia hacer ? Que exactamente no funciona ?

Ten en cuenta que el atributo onsubmit del form debe quedar asi:

1
onsubmit="return compararFecha() && compararHora()"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 5
Ha aumentado su posición en 28 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

Ayuda con formulario, validar fechas y pasar datos por evento onsubmit

Publicado por pedro (4 intervenciones) el 05/06/2017 08:32:02
Vale, gracias. No me habia dado cuenta de lo del formulario. Ahora si que funciona, no sabia que se podía usar el && para las dos funciones, siempre las separaba por (;).

Doy el tema como solucionado. Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar