Felipe
Iota
Redactor
Verificación en dos pasos activada
Verificado por Whatsapp
<!DOCTYPE html>
<html lang="es_ES">
<head>
<meta charset="UTF-8">
<title>Nota - 4</title>
<link href="css/bootstrap.min.css" rel="stylesheet" media="screen">
<script src="js/jquery-3.1.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
var nextinput = 0;
function AgregarCampos(){
nextinput++;
campo = '<li id="idLi'+nextinput+'"><input type="number" size="20" id="nota'+nextinput+'" name="nota'+nextinput+'" step="any" onChange="multiplicar(nota'+nextinput+',pondera'+nextinput+',acumu'+nextinput+');" value=0 /> x <input type="number" size="20" id="pondera'+nextinput+'" name="pondera'+nextinput+'" step="any" onChange="multiplicar(nota'+nextinput+',pondera'+nextinput+',acumu'+nextinput+');" value=0 /> = <input type="number" size="20" id="acumu'+nextinput+'" name="acumu'+nextinput+'" step="any"/></li>';
$("#campos").append(campo);
}
function multiplicar(nota,pondera,acumu){
m1 = document.getElementById("nota").value;
m2 = document.getElementById("pondera").value;
r = m1*m2;
document.getElementById("acumu").value = r;
}
</script>
</head>
<body>
<form id="form" name="form" method="post">
<a href="#" onclick="AgregarCampos();">Agregar Nota</a>
<div id="campos"></div>
</form>
</form>
</body>
</html>
<!DOCTYPE html>
<html lang="es_ES">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<script type="text/javascript">
var nextinput = 0;
function AgregarCampos(){
nextinput++;
campo = '<li id="idLi'+nextinput+'"><input type="number" size="20" id="nota'+nextinput+'" name="nota'+nextinput+'" step="any" onChange="multiplicar(\'nota'+nextinput+'\',\'pondera'+nextinput+'\',\'acumu'+nextinput+'\');" value=0 /> x <input type="number" size="20" id="pondera'+nextinput+'" name="pondera'+nextinput+'" step="any" onChange="multiplicar(\'nota'+nextinput+'\',\'pondera'+nextinput+'\',\'acumu'+nextinput+'\');" value=0 /> = <input type="number" size="20" id="acumu'+nextinput+'" name="acumu'+nextinput+'" step="any"/></li>';
$("#campos").append(campo);
}
function multiplicar(nota,pondera,acumu){
m1 = document.getElementById(nota).value; //Dejo fijo los input y resulta.
m2 = document.getElementById(pondera).value; //Así funciona... pero cuando le entrego valores variables, no
r = m1*m2;
document.getElementById(acumu).value = r;
}
</script>
</head>
<body>
<form id="form" name="form" method="post">
<a href="#" onclick="AgregarCampos();">Agregar Nota</a>
<ul id="campos"></ul>
</form>
</body>
</html>
<!DOCTYPE html>
<html lang="es_ES">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
$(document).on('keyup', '#campos input', function(e){
var p = $(this).parent().find('input');
p.eq(2).val(p.eq(0).val()*p.eq(1).val());
});
$(document).on('click', '#agregar', function(e){
$('#campos').append('<li><input type="number" value="0" /> x <input type="number" value="0" /> = <input type="number" /></li>');
e.preventDefault();
});
});
</script>
</head>
<body>
<form id="form" name="form" method="post">
<a href="#" id="agregar">Agregar Nota</a>
<ul id="campos"></ul>
</form>
</body>
</html>
<!DOCTYPE html>
<html lang="es_ES">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<script type="text/javascript">
var nextinput = 0;
function AgregarCampos(){
nextinput++;
campo = '<li id="idLi'+nextinput+'"><input type="number" size="20" id="nota'+nextinput+'" name="nota'+nextinput+'" step="any" onChange="multiplicar(\'nota'+nextinput+'\',\'pondera'+nextinput+'\',\'acumu'+nextinput+'\');" value=0 /> x <input type="number" size="20" id="pondera'+nextinput+'" name="pondera'+nextinput+'" step="any" onChange="multiplicar(\'nota'+nextinput+'\',\'pondera'+nextinput+'\',\'acumu'+nextinput+'\');" value=0 /> = <input class="importe_linea" type="number" size="20" id="acumu'+nextinput+'" name="acumu'+nextinput+'" step="any"/></li>';
$("#campos").append(campo);
}
function multiplicar(nota,pondera,acumu){
m1 = document.getElementById(nota).value;
m2 = document.getElementById(pondera).value;
r = m1*m2/100;
document.getElementById(acumu).value = r;
}
function calcular_promedio() {
importe_total = 0
$(".importe_linea").each(
function(index, value) {
importe_total = importe_total + eval($(this).val());
}
);
$("#total").val(importe_total);
}
</script>
</head>
<body>
<form id="form" name="form" method="post">
<a href="#" onclick="AgregarCampos();">Agregar Nota</a>
<ul id="campos"></ul>
<input type="button" value="Calcular Promedio" onclick="calcular_promedio()"/> <input type="text" id="total" value="0"/><br/>
</form>
</body>
</html>
Prueba esto, no he conseguido que calcule la suma en tiempo real, solo mediante un botón
Un saludo
<script type="text/javascript" language="JavaScript">
var nextinput = 0;
var total = 0;
function AgregarCampos(){
nextinput++;
campo = '<li id="idLi'+nextinput+'"><input type="number" size="20" id="nota'+nextinput+'" name="nota'+nextinput+'" step="any" onChange="multiplicar(\'nota'+nextinput+'\',\'pondera'+nextinput+'\',\'acumu'+nextinput+'\');" value=0 /> x <input type="number" size="20" id="pondera'+nextinput+'" name="pondera'+nextinput+'" step="any" onChange="multiplicar(\'nota'+nextinput+'\',\'pondera'+nextinput+'\',\'acumu'+nextinput+'\');" value=0 /> = <input type="number" size="20" id="acumu'+nextinput+'" name="acumu'+nextinput+'" step="any"/></li>';
$("#campos").append(campo);
}
function multiplicar(nota,pondera,acumu){
m1 = document.getElementById(nota).value;
m2 = document.getElementById(pondera).value;
r = m1 * (m2/100);
total = total + r;
document.getElementById(acumu).value = r;
document.getElementById("promediof").value = total;
}
</script>
<form id="form" name="form" method="post">
<a href="#" onclick="AgregarCampos();">Agregar Nota</a>
<ul id="campos">
<li><input type="number" name="promedio" id="promediof" step="any"></li>
</ul>
</form>
function formReset(){
document.form.reset();
}
<input type="button" name="" value="Borrar" onclick="formReset()">
function resetear() {
$('#form')[0].reset();
}
<a href="#" onclick="resetear();">Limpiar formulario</a>
P.D: Si quieres que los campos se vayan insertando antes del promedio de la nota puedes cambiar
Insertar CODE, HTML o PHP:$("#campos").append(campo);
Por:
Insertar CODE, HTML o PHP:$("#campos").prepend(campo);
Aquí te dejo un ejemplo: https://jsfiddle.net/4Ld3p6be/4/
Para el reset puedes añadir esta función:
Insertar CODE, HTML o PHP:function resetear() { $('#form')[0].reset(); }
Y este HTML:
HTML:<a href="#" onclick="resetear();">Limpiar formulario</a>
Para hacer algo sencillo se me ocurre algo así: https://jsfiddle.net/4Ld3p6be/5/Genial, muchas gracias en este hilo he aprendido mucho!
El enlace para limpiar el formulario funciona perfecto, pero la idea es que también se borren las "notas que se añadieron" (los input agregados). En eso estoy.
Muchas gracias nuevamente, me ha servido mucho vuestra ayuda!
Para hacer algo sencillo se me ocurre algo así: https://jsfiddle.net/4Ld3p6be/5/
Claro, en la función AgregarCampos, cambias:Eso está de lujo, intentaré combinarlo con algo como eliminar por fila (Eliminar un <li></li> en específico) ¿Se puede? Yo creo que sí, lo he visto con tablas.
campo = '<li id="idLi' + nextinput + '"><input type="number" size="20" id="nota' + nextinput + '" name="nota' + nextinput + '" step="any" onChange="multiplicar(\'nota' + nextinput + '\',\'pondera' + nextinput + '\',\'acumu' + nextinput + '\');" value=0 /> x <input type="number" size="20" id="pondera' + nextinput + '" name="pondera' + nextinput + '" step="any" onChange="multiplicar(\'nota' + nextinput + '\',\'pondera' + nextinput + '\',\'acumu' + nextinput + '\');" value=0 /> = <input type="number" size="20" id="acumu' + nextinput + '" name="acumu' + nextinput + '" step="any"/></li>';
campo = '<li id="idLi' + nextinput + '"><input type="number" size="20" id="nota' + nextinput + '" name="nota' + nextinput + '" step="any" onChange="multiplicar(\'nota' + nextinput + '\',\'pondera' + nextinput + '\',\'acumu' + nextinput + '\');" value=0 /> x <input type="number" size="20" id="pondera' + nextinput + '" name="pondera' + nextinput + '" step="any" onChange="multiplicar(\'nota' + nextinput + '\',\'pondera' + nextinput + '\',\'acumu' + nextinput + '\');" value=0 /> = <input type="number" size="20" id="acumu' + nextinput + '" name="acumu' + nextinput + '" step="any"/><a href="#" onClick="$(this).parent().remove()">Borrar</a></li>';
Claro, en la función AgregarCampos, cambias:
Insertar CODE, HTML o PHP:campo = '<li id="idLi' + nextinput + '"><input type="number" size="20" id="nota' + nextinput + '" name="nota' + nextinput + '" step="any" onChange="multiplicar(\'nota' + nextinput + '\',\'pondera' + nextinput + '\',\'acumu' + nextinput + '\');" value=0 /> x <input type="number" size="20" id="pondera' + nextinput + '" name="pondera' + nextinput + '" step="any" onChange="multiplicar(\'nota' + nextinput + '\',\'pondera' + nextinput + '\',\'acumu' + nextinput + '\');" value=0 /> = <input type="number" size="20" id="acumu' + nextinput + '" name="acumu' + nextinput + '" step="any"/></li>';
Por:
Insertar CODE, HTML o PHP:campo = '<li id="idLi' + nextinput + '"><input type="number" size="20" id="nota' + nextinput + '" name="nota' + nextinput + '" step="any" onChange="multiplicar(\'nota' + nextinput + '\',\'pondera' + nextinput + '\',\'acumu' + nextinput + '\');" value=0 /> x <input type="number" size="20" id="pondera' + nextinput + '" name="pondera' + nextinput + '" step="any" onChange="multiplicar(\'nota' + nextinput + '\',\'pondera' + nextinput + '\',\'acumu' + nextinput + '\');" value=0 /> = <input type="number" size="20" id="acumu' + nextinput + '" name="acumu' + nextinput + '" step="any"/><a href="#" onClick="$(this).parent().remove()">Borrar</a></li>';
Demo: https://jsfiddle.net/4Ld3p6be/6/
Algo así:¡wow! :love_heart: Gracias!
Ahora mi tarea es que se actualice el promedio una vez se borre la linea.
Mucísimas gracias!:welcoming:
Algo así:
https://jsfiddle.net/4Ld3p6be/7/
P.D: Le corregí tambien un par de bugs que tenía en el botón de resetear formulario. Disculpa 🙁
vaya! claro que sí, algo así!
Me queda una duda, al limpiar el formulario la variable total queda en memoria, entonces al agregar una nueva nota sin actualizar la página, este queda con el antiguo valor.
Estaba mirando que con algo así: $.removeData(miVariable); puedo borrar una variable en memoria... ¿No? pero no me resulta.
Estaba haciendo cálculos con el nuevo código que me has entregado amigo [MENTION=108344]aperpen[/MENTION], del cual estoy totalmente agradecido, pero las sumas no cuadran.
total = 0;
Si, ese era el bug que solucione en teoría. Puedes borrar la variable poniendo simplemente:
Insertar CODE, HTML o PHP:total = 0;
¿Con qué números no te cuadran las sumas?
Por ejemplo añadiendo una nota con ponderación del 20%, luego borrarla y añadir la misma nota y otra con ponderación del 80%, resulta lo siguiente:
Ver el archivo adjunto 91777
Luego al borrar el de 80, el resultado es:
Ver el archivo adjunto 91778
- - - Actualizado - - -
La variable total no se resetea o no se actualiza en conjunto con los eventos borrar o agregar... Esto, para mi al menos, resultó ser más complicado de lo que pensé... xD
Una vez lo hice pero con notas fijas, digamos que con 5 notas en total. Fue bastante fácil, pero ahora al volverla dinámica la aplicación resulta que tiene más de alguna complejidad.
Quiero agradecer vuestra ayuda, ¡muchas gracias!
Que raro, a mi me funciona bien esa suma en concreto.. También el problema puede ser por que JavaScript tiene una forma extraña de trabajar con números decimales language agnostic - Is floating point math broken? - Stack Overflow
De cualquier forma, he hecho esta versión que lo que hace es redondear los resultados, a ver si así se soluciona el problema: https://jsfiddle.net/4Ld3p6be/8/
Una cosa importante a tener en cuenta es que por como está hecha la función de multiplicar no se puede cambiar una nota ya escrita, es decir, tendrías que darle a borrar y luego a escribirla de nuevo, si no se descuadrará el promedio
Saludos
Utilizamos cookies y tecnologías similares para los siguientes fines:
¿Aceptas las cookies y estas tecnologías?
Utilizamos cookies y tecnologías similares para los siguientes fines:
¿Aceptas las cookies y estas tecnologías?