Javascript 递归太多-单选按钮-jquery
我有一个动态表单,在许多字段中,当用户继续使用表单时,我希望自动计算。在表格中,我有两个单选按钮Javascript 递归太多-单选按钮-jquery,javascript,jquery,yii2,Javascript,Jquery,Yii2,我有一个动态表单,在许多字段中,当用户继续使用表单时,我希望自动计算。在表格中,我有两个单选按钮mrp和rate。默认情况下,选择mrp。如果用户不更改所选的默认按钮,则值totalCst将被计算为所有行的qty*mrp*cstpercent。 如果用户选择rate单选按钮,则该值将计算为所有行的qty*rate*cstpercent。稍后我将添加onchange事件。首先,我想得到totalCst的值,该值仅在mrp上计算,或以选择的速率为准 单选按钮代码- <div class="fo
mrp
和rate
。默认情况下,选择mrp。如果用户不更改所选的默认按钮,则值totalCst
将被计算为所有行的qty*mrp*cstpercent
。
如果用户选择rate
单选按钮,则该值将计算为所有行的qty*rate*cstpercent
。稍后我将添加onchange事件。首先,我想得到totalCst的值,该值仅在mrp上计算,或以选择的速率为准
单选按钮代码-
<div class="form-group pull-right">
<label class="radio-inline"><input type="radio" name="taxon" id="mrp" value="mrp" checked="checked">MRP</label>
<label class="radio-inline"><input type="radio" name="taxon" id="rate" value="rate">Rate</label>
</div>
物料需求计划
比率
JS
我在警报中选择了值,但弹出窗口太多,出现错误-
太多的递归
更新的JS
<?php
/* start getting the total amount */
$this->registerJs('
var totalCstonamount = 0;
var totalWbstonamount = 0;
var totalCstonmrp = 0;
var totalWbstonmrp = 0;
function getSum() {
var sum = 0;
var totalDiscount = 0;
var totalMrp = 0;
var totalCst = 0;
var totalWbst = 0;
// var totalCstonamount = 0;
// var totalWbstonamount = 0;
// var totalCstonmrp = 0;
// var totalWbstonmrp = 0;
var cstperValue = $(".cstPercent").val();
var wbstperValue = $(".wbstPercent").val();
//var selectedValue = $("input[name=taxon]:checked").val();
//alert(selectedValue);
var items = $(".item");
items.each(function (index, elem) {
var qtyValue = $(elem).find(".qty").val();
var rateValue = $(elem).find(".rate").val();
var discValue = $(elem).find(".disc").val();
var mrpValue = $(elem).find(".mrp").val();
var freeValue = $(elem).find(".free").val();
sum = (parseFloat(sum) + (parseFloat(qtyValue) * parseFloat(rateValue))).toFixed(2);
totalDiscount = (parseFloat(totalDiscount) + ((parseFloat(qtyValue) * parseFloat(rateValue) * parseFloat(discValue))/100)).toFixed(2);
totalMrp = (parseFloat(totalMrp) + ((parseFloat(qtyValue) + parseFloat(freeValue)) * parseFloat(mrpValue))).toFixed(2);
totalCstonamount = (parseFloat(totalCst) + ((parseFloat(qtyValue) * parseFloat(rateValue)) * parseFloat(cstperValue))/100).toFixed(2);
totalWbstonamount = (parseFloat(totalWbst) + ((parseFloat(qtyValue) * parseFloat(rateValue)) * parseFloat(wbstperValue))/100).toFixed(2);
totalCstonmrp = (parseFloat(totalCst) + (((parseFloat(qtyValue) + parseFloat(freeValue)) * parseFloat(mrpValue)) * parseFloat(cstperValue))/100).toFixed(2);
totalWbstonmrp = (parseFloat(totalWbst) + (((parseFloat(qtyValue) + parseFloat(freeValue)) * parseFloat(mrpValue)) * parseFloat(wbstperValue))/100).toFixed(2);
});
if(isNaN(sum) || sum.length == 0) {
sum = 0;
}
if(isNaN(totalDiscount) || totalDiscount.length == 0) {
totalDiscount = 0;
}
if(isNaN(totalMrp) || totalMrp.length == 0) {
totalMrp = 0;
}
if(isNaN(totalCstonamount) || totalCstonamount.length == 0) {
totalCstonamount = 0;
}
if(isNaN(totalWbstonamount) || totalWbstonamount.length == 0) {
totalWbstonamount = 0;
}
if(isNaN(totalCstonmrp) || totalCstonmrp.length == 0) {
totalCstonmrp = 0;
}
if(isNaN(totalWbstonmrp) || totalWbstonmrp.length == 0) {
totalWbstonmrp = 0;
}
$(".sum").val(sum);
$(".totalDiscount").val(totalDiscount);
$(".totalMrp").val(totalMrp);
// if (selectedValue == "mrp") {
// getSum();
// $(".totalCst").val(totalCstonmrp);
// }
// else if (selectedValue == "rate") {
// getSum();
// $(".totalCst").val(totalCstonamount);
// }
}
function getSumonclick(){
}
$(".container-items").on("change", function() {
getSum();
});
$(".cstPercent").on("change", function() {
getSum();
});
$(".wbstPercent").on("change", function() {
getSum();
});
getSum();
var selectedValue = $("input[name=taxon]:checked").val();
// var totalCstonamount = 200;
// var totalWbstonamount = 0;
// var totalCstonmrp = 100;
// var totalWbstonmrp = 0;
if (selectedValue == "mrp") {
getSum();
if(isNaN(totalCstonmrp) || totalCstonmrp.length == 0) {
totalCstonmrp = 0;
}
$(".totalCst").val(totalCstonmrp);
}
else if (selectedValue == "rate") {
getSum();
if(isNaN(totalCstonamount) || totalCstonamount.length == 0) {
totalCstonamount = 0;
}
$(".totalCst").val(totalCstonamount);
}
jQuery(".dynamicform_wrapper").on("afterDelete", function(e) {
getSum();
});
');
/*end getting the total amount */
?>
根据我的理解,现在的问题是从getSum函数内部到外部获取计算值
首先,我想得到仅根据mrp或费率计算的totalCst值
以选定的为准
如果。。。否则…:
var factor = (factorMrp.checked ? 'mrp' : 'rate');
工作示例:
var factors=document.getElementById('factors');
var factorMrp=document.getElementById('mrp');
var factorRate=document.getElementById('rate');
var段落=document.getElementsByTagName('p')[0];
factorMrp.checked=真;
函数校验因子(){
var系数=(factorMrp.checked?'mrp':'rate');
paragration.textContent='总CST值将计算为所有行的数量*'+系数+'*CST百分比';
}
因素。addEventListener('change',checkFactor,false);
window.addEventListener('load',checkFactor,false)代码>
字段集{
显示:内联块;
}
物料需求计划
比率
首先,我想得到仅根据mrp或费率计算的totalCst值
以选定的为准
如果。。。否则…
:
var factor = (factorMrp.checked ? 'mrp' : 'rate');
工作示例:
var factors=document.getElementById('factors');
var factorMrp=document.getElementById('mrp');
var factorRate=document.getElementById('rate');
var段落=document.getElementsByTagName('p')[0];
factorMrp.checked=真;
函数校验因子(){
var系数=(factorMrp.checked?'mrp':'rate');
paragration.textContent='总CST值将计算为所有行的数量*'+系数+'*CST百分比';
}
因素。addEventListener('change',checkFactor,false);
window.addEventListener('load',checkFactor,false)代码>
字段集{
显示:内联块;
}
物料需求计划
比率
自$(“输入[name=taxon]:选中”).val()代码>,又名selectedValue
,在getSum()
调用之间没有变化,它要么保持“mrp”或“rate”。如果它也保持为“mrp”或“rate”,则应在If..else中检测到它。。语句并允许计算getSum。。如果我错了,请告诉我。还有,如何修复它。如果这些值保持不变并不断地通过条件,就会有太多的递归getSum()
一直在调用自身。必须有一个转折点。设置一个范围更大的变量或其他什么。如何修复它?尝试将selectedValue
放在getSum()
范围之外(函数上方),然后执行类似selectedValue=undefined的操作在您的条件下调用getSum()
之后。那么它就不会是“mrp”或“rate”,而且getSum()
也不会一直调用自己代码>,又名selectedValue
,在getSum()
调用之间没有变化,它要么保持“mrp”或“rate”。如果它也保持为“mrp”或“rate”,则应在If..else中检测到它。。语句并允许计算getSum。。如果我错了,请告诉我。还有,如何修复它。如果这些值保持不变并不断地通过条件,就会有太多的递归getSum()
一直在调用自身。必须有一个转折点。设置一个范围更大的变量或其他什么。如何修复它?尝试将selectedValue
放在getSum()
范围之外(函数上方),然后执行类似selectedValue=undefined的操作在您的条件下调用getSum()
之后。这样就不会是“mrp”或“rate”,而且getSum()
也不会一直调用自己。