如何确保在POST之前完成对表单DOM的更改?

时间:2009-11-16 15:45:29

标签: javascript html forms dom

目前我的JavaScript代码中存在竞争条件。我要对此代码执行的操作是转换所有复选框,这些复选框是“复选框”类的一部分,不会在值为零的文本框中进行检查。目前,当您发布未选中的复选框时,它不会显示在$_POST数据中。但是,我需要知道这些特定复选框的所有值是真还是假。

我的代码在这里: 代码:

function checkboxConvert() {

  var chkBxs = $$('.checkbox');
  for (var i = 0; i < chkBxs.length; i++) {
    if (chkBxs[i].checked == false) {
      chkBxs[i].type = 'textbox';
      chkBxs[i].value = '0';
    }
  }

  setTimeout("document.productForm.submit();",1000);
}

现在我遇到的问题是,当我尝试提交此表单时,最近更改的文本框的值不会显示在$_POST数据中。因此,正如您在上面所看到的,我已将页面提交推迟1秒,然后我将所有数据提供给我。但随着时间的推移,我的数据集变大,1秒可能不再足够。我认为这是一个竞争条件,我需要找到一些运行代码的方法,只有在所有复选框都已转换并且它们具有新值之后。我原以为这从一开始就没有必要,但由于某种原因,它试图同时运行两个部分,直到我有适当的值才能提交。

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:4)

这绝对不是网络的方式。我强烈建议你放弃你的checkboxConvert函数,并在服务器端解决这个问题

答案 1 :(得分:3)

JavaScript always runs single-threaded in the browser所以我不认为这可能是竞争条件。

答案 2 :(得分:2)

我一般都认为你不应该这样做,但你的问题可能是你正在将元素改为“文本框”而不是“文本”。如果在HTML标记中声明类型为“textbox”的输入,它通常会呈现为文本字段,因为这是默认值。但是,将已经有效的“复选框”类型输入更改为无效的“文本框”可能无法预测。

尝试将其更改为:

function checkboxConvert() {

  var chkBxs = $$('.checkbox');
  for (var i = 0; i < chkBxs.length; i++) {
    if (chkBxs[i].checked == false) {
      chkBxs[i].type = 'text';
      chkBxs[i].value = '0';
    }
  }

  // Because JS in the browser is single-threaded, this
  //  cannot execute before the preceding loop completes anyway.
  document.productForm.submit();
}

答案 3 :(得分:1)

必须有更好的方法来做到这一点。尝试类似:

  1. 了解服务器端的所有可能值。看起来你正在使用PHP;保留一个包含复选框名称的简单数组。
  2. 当您获取$ _POST数据时,请从阵列中删除您收到的复选框的名称。
  3. 剩下的都是假的。