2009-11-16 54 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(); 
} 
相關問題