我有一个Javascript函数,在我注释掉/删除alert()
行之前效果很好。它计算最多30个字段的总和(如果它们存在)以及它们是否有值。
HTML:
<input type="text" onblur="Calculatenettobrutto(1);">
JavaScript的:
function Calculatenettobrutto(n) {
var Feldnummer=n;
var nettowert,bruttowert;
var nettosumme, bruttosumme,neuenettosumme,neuebruttosumme;
var Wertfuer='Mehrwertsteuersatz'
//Mehrwertsteuer auslesen
var dataString = 'Name='+Wertfuer;
var thisObject = this;
this.wert=$.ajax({
type: "POST",
url: "ajax_get_Einstellungen.php",
data: dataString,
cache: false,
success: function(wert) {
nettowert = document.getElementById('Netto'+Feldnummer).value;
bruttowert = parseFloat(nettowert) * wert;
document.getElementById('Brutto'+Feldnummer).value=parseFloat(bruttowert);
return wert;
}
});
var nettosumme=0,bruttosumme=0, x=1;
while (x < 30) {
var Feldname='Netto'+x;
if ( document.getElementById('Netto'+x) ) {
//If field Netto+x exist then check if it has a value
var nettowert=document.getElementById('Netto'+x).value;
//if it has a value add values to nettosumme and bruttosumme
if (nettowert) {
nettosumme=parseFloat(nettosumme)+parseFloat(document.getElementById('Netto'+x).value);
//IF I COMMENT THIS OUT, I get a NAN in my Bruttosumme column
alert(nettosumme);
bruttosumme=parseFloat(bruttosumme)+parseFloat(document.getElementById('Brutto'+x).value);
}
}
x++;
}
document.getElementById('Nettosumme').value=parseFloat(nettosumme);
document.getElementById('Bruttosumme').value=parseFloat(bruttosumme);
}
即使删除alert()
行,我如何才能使其正常工作?
答案 0 :(得分:6)
问题是您执行异步Ajax请求:
<input type="text" onblur="Calculatenettobrutto(1)" />
一旦用户离开该字段,就会调用Calculatenettobrutto
。然后调用你的函数:
var Feldnummer = 1;
this.wert=$.ajax({
...
success: function(wert) {
...
nettowert = document.getElementById('Netto'+Feldnummer).value;
bruttowert = parseFloat(nettowert) * wert;
document.getElementById('Brutto'+Feldnummer).value=parseFloat(bruttowert);
}
});
//alert("Wait a little");
document.getElementById('Brutto'+Feldnummer).value <-- BANG
这里的问题如下:当从服务器返回ajax调用的结果时,调用ajax()中定义的函数,即ajax()之后的代码立即执行。所以你试着在设置之前从字段中获取值。
当警报窗口可见时,脚本被暂停并且ajax调用返回并执行设置“Brutto ...”值的“成功”代码。关闭警报后,代码将被执行,现在“Brutto ...”有一个值。
最简单的解决方案是将总和计算功能转移到“成功”功能