Ver Mensaje Individual
  #10 (permalink)  
Antiguo 09/09/2014, 16:47
Avatar de Alexis88
Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: cambiar a multiplicacion

¿Quieres que el monto fijo sea el valor del checkbox seleccionado? Pues, en ese caso, tendrías que pasarle como argumento a la función el valor del checkbox seleccionado y luego solo operas con ella. Como la función también es invocada por los radiobutton y estos no le pasan valor alguno, haré uso del objeto arguments, el cual contiene a los valores pasados a la función como argumentos.

Código Javascript:
Ver original
  1. var productos = document.querySelectorAll("[type=checkbox]"),
  2.     medidas = document.querySelectorAll("[type=radio]"),
  3.     salida = document.querySelector("#resultado"),
  4.     total = 0,
  5.     checkbox =0,
  6.     acumulado = 0,
  7.     radioMarcado = null,
  8.     calcular = function(){
  9.         this.fijo = arguments ? arguments[0] : this.fijo || 0;
  10.        
  11.         if (!document.querySelectorAll("[type=checkbox]:checked").length){
  12.             total = 0; 
  13.         }
  14.         else{
  15.             radioMarcado = document.querySelectorAll("[type=radio]:checked")[0];
  16.             total = ( fijo / 7) * Number(radioMarcado.value) + acumulado;  
  17.         }      
  18.         salida.innerHTML = "Total sin iva: S$" + total.toFixed(2);
  19.     };
  20.  
  21. [].forEach.call(productos, function(producto){
  22.     producto.addEventListener("click", function(){
  23.         if (this.checked) acumulado += Number(this.value);
  24.         else acumulado -= Number(this.value);
  25.         calcular(this.value);
  26.     }, false);
  27. });
  28.  
  29. [].forEach.call(medidas, function(medida){
  30.     medida.addEventListener("click", calcular, false);
  31. });

Ahora fijo se convirtió en this.fijo, es decir, en un atributo del objeto global y ya no en una variable más. Esto lo hago para preservar su valor en futuras llamadas, pues, como verás, antes de asignarle un valor, verifico si se han recibido argumentos a la función; de haberlos, tomo al primero de ellos y lo asigno a this.fijo, caso contrario, le asigno el valor que previamente se le haya asignado en una llamada anterior a la función y si no hubieron llamadas antes de esa (como sería al inicio), le asigno el cero.

Para utilizar dicho valor, ya no es necesario colocar el this adelante, pues se sobreentiende de que se trata de dicho valor. Por otro lado, al darle un clic a alguno de los checkbox, envío el valor del checkbox marcado o desmarcado. Esto último no afectará al resultado pues en la función se valida si hay al menos un checkbox marcado y si no lo hay, el resultado será siempre igual a cero.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand