¿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 originalvar productos = document.querySelectorAll("[type=checkbox]"),
medidas = document.querySelectorAll("[type=radio]"),
salida = document.querySelector("#resultado"),
total = 0,
checkbox =0,
acumulado = 0,
radioMarcado = null,
calcular = function(){
this.fijo = arguments ? arguments[0] : this.fijo || 0;
if (!document.querySelectorAll("[type=checkbox]:checked").length){
total = 0;
}
else{
radioMarcado = document.querySelectorAll("[type=radio]:checked")[0];
total = ( fijo / 7) * Number(radioMarcado.value) + acumulado;
}
salida.innerHTML = "Total sin iva: S$" + total.toFixed(2);
};
[].forEach.call(productos, function(producto){
producto.addEventListener("click", function(){
if (this.checked) acumulado += Number(this.value);
else acumulado -= Number(this.value);
calcular(this.value);
}, false);
});
[].forEach.call(medidas, function(medida){
medida.addEventListener("click", calcular, false);
});
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