2009-11-16 47 views
0

目前我的JavaScript代码中存在竞争条件。我正在尝试使用此代码将所有复选框都转换为“复选框”类的一部分,并且不会将其复选到值为零的文本框中。目前,当您发布未选中的复选框时,它不会出现在$_POST数据中。不过,我需要知道这些特定复选框的所有值是true还是false。如何确保在发布前对表单DOM的更改已完成?

我的代码是在这里: 代码:

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秒可能已经不够了。我认为这是一种竞争条件,只有在所有复选框已被转换并且具有新值的情况下,我才需要以某种方式运行代码。我一直认为从一开始就没有必要这么做了,但由于某种原因,它试图同时运行这两件作品,直到我拥有适当的值才能提交。

任何帮助非常感谢!

+0

DOM操作很慢。我的猜测是,文本框转换发生的速度比您的时间限制要慢,正如您可能已经想到的那样。 – 2009-11-16 15:50:13

+2

FWIW:根据MSDN,一旦添加到文档中(在Internet Explorer中),就不能更改“输入”元素的“类型”。所以你可能想重新考虑这整个策略......(参考:http://msdn.microsoft.com/en-us/library/ms534700.aspx) – Shog9 2009-11-16 16:01:11

回答

4

这绝对不是做web的方式。我强烈建议你放弃你的checkboxConvert功能,并在服务器端解决这个问题

+3

我同意这一点。在您的服务器端代码中,缺少复选框意味着没有值。这足以告诉你它是零。如果你依赖于文本框的存在来知道该怎么做,那么你有一个完全不同的安全问题。 – NotMe 2009-11-16 16:30:44

1

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

  1. 了解服务器端的所有可能值。它看起来像你使用PHP;用复选框的名称保存一个简单的数组。
  2. 当您获取$ _POST数据时,请从数组中删除您收到的值的复选框名称。
  3. 其余都是假的。
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(); 
} 
相关问题