【问题标题】:Javascript does not work without alert()没有 alert() Javascript 无法工作
【发布时间】:2013-05-21 16:33:03
【问题描述】:

我有一个运行良好的 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() 行,我如何使它工作?

【问题讨论】:

  • 你能在 jsFiddle.net 的例子中重现这个吗?
  • 确保您的调试器中没有设置任何断点。
  • 您确定该值在执行时就在那里,而不是在执行之后一点点?这似乎有效,因为您使用 alert() 命令延迟了其余的执行。
  • 你是在文档发送完ready事件后调用这个函数吗?
  • @MofX 您对问题的编辑过于激进。我已经回滚了。您如何将源代码添加到问题中?我假设是真诚的,但你应该添加一个答案而不是改变问题..(我现在明白了,你已经做到了)

标签: javascript jquery ajax dom


【解决方案1】:

问题是你做了一个异步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...”有了一个值。

可能最简单的解决方案是将总和计算函数移到“成功”函数中

【讨论】:

  • 这应该可以工作 - 或者将 calc 部分放在一个新函数中并在成功时调用它,但效果相同。我曾讨论过使用deffered 提供答案,但这应该可行。
猜你喜欢
  • 1970-01-01
  • 2014-11-12
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多