Ver Mensaje Individual
  #3 (permalink)  
Antiguo 21/03/2012, 07:52
luis_vega
 
Fecha de Ingreso: marzo-2012
Ubicación: Madrid
Mensajes: 74
Antigüedad: 12 años, 1 mes
Puntos: 12
Respuesta: Script embrujado: Resta cuando tiene que sumar

Suposiciones:
Tienes dos lista select:
- cantidad: Sus opciones son <valor=cientos de gramos, texto= gramos>
- ??: Sus opciones son <valor=calorias por cada 100 gramos, texto= nombre alimento>

En algun momento, no se cuando, llamas a la funcion "Propiedades", en donde asignas a la variable global "valor" los cientos de gramos seleccionados en la lista select cantidad.


En algun momento, no se cuando (¿cuando eliges algun alimento?), llamas a la funcion "insertar_el_numero", que añade la informacion del alimento (calorias, nombre) seleccionado al array "_list_kalorias" y lanza el calculo del total de calorias para el conjunto de cantidades de alimentos seleccionadas.


El problema viene dado porque en ese calculo siempre empleas el mismo valor de cantidad, el último almacenado en la variable global "valor", en lugar del seleccionado en el momento que añadiste el alimento a la lista. Es decir tienes "n" alimentos, pero solo una cantidad, la misma, para todos ellos.

La solucion pasa por efectuar el calculo antes de que cambie el peso seleccionado o almacenar junto con cada alimento su cantidad.

La forma mas sencilla de arreglarlo es:
En lugar de llamar a "insertar_el_numero", llamar a "calculate", con el codigo modificado/simplificado asi:
Código:
<script language="javascript">
  var valor_total=0;
  
  function calculate(op) {
    var form = document.getElementById('formulario');
    var indice = form.cantidad.selectedIndex;
    var valor = form.cantidad.options[indice].value;
    var chosenoption=op.options[op.selectedIndex] //this refers to "selectmenu"
        
    valor_total += op.value*valor;
    
    form.seleccionados.value += op.text +':'+op.value*valor+"\n"; 
    form.suma.value = "Total: "+valor_total+" kcal" ;    
  }
</script>

Yo lo habria hecho asi:
Suponiendo que la lista select que contiene los posibles alimentos se llama "alimento".
Defino un "objeto" llamado "Seleccion" que representa cada par peso-alimento elegido por el usuario.
Cuando el usuario elige un alimento y una cantidad, llamo a la funcion "seleccionar", añadiendo el nombre del alimento, sus calorias y el peso seleccionado al array que representa el conjunto de selecciones realizado y llamo a la funcion calculate para sumarizar todo y actualizar la informacion.

Código:
var lista = new Array();

function Seleccion(nombre, calorias, c_gramos) {
  this.nombre = nombre;
  this.calorias = calorias;
  this.c_gramos = c_gramos;
}


function seleccionar() {
  var form = document.getElementById('formulario');
  var indice = form.cantidad.selectedIndex;
  var c_gramos = form.cantidad.options[indice].value;
  indice = form.alimento.selectedIndex;
  var calorias = form.alimento.options[indice].value;
  var nombre = form.alimento.options[indice].text;
  
  lista.push(new Seleccion(nombre,calorias,c_gramos));
  calculate(); 
}


function calculate() {
  var texto = "";
  var suma_calorias = 0;
  for(var i=0; i<lista.length; i++) {
    var seleccion = lista[i];
    var calorias_seleccion = (seleccion.calorias * seleccion.c_gramos);
    texto += seleccion.nombre + ":" + calorias_seleccion + "\n";
    suma_calorias += calorias_seleccion;
  }
  var form = document.getElementById('formulario');
  form.seleccionados.value=texto;
  form.suma.value="Total: "+suma_calorias+" kcal" ;
}