簡體   English   中英

如何確保在發布之前完成對表單DOM的更改?

[英]How can I ensure that changes to a form DOM are complete before POSTing?

目前,我的JavaScript代碼中存在一個競爭條件。 我要用此代碼執行的操作是將所有復選框都轉換為“復選框”類的一部分,並且不會將其選中為值為零的文本框。 當前,當您發布未選中的復選框時,它不會出現在$_POST數據中。 但是,我需要知道這些特定復選框的所有值,是true還是false。

我的代碼在這里:代碼:

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秒可能不再足夠。 我認為這是一個競爭條件,只有在所有復選框都已轉換並且它們具有新值之后,我才需要找到某種方式來運行代碼。 我本來以為從一開始就沒有必要這樣做,但是由於某種原因,它試圖同時運行這兩部分,並且只有在適當的值到位之前我才能提交。

任何幫助深表感謝!

這絕對不是做網絡的方法。 我強烈建議您放棄checkboxConvert函數,並在服務器端解決此問題

JavaScript始終在瀏覽器中運行單線程,因此我認為這可能不是競爭條件。

我通常會與其他人一樣,您不應該這樣做,但是您的問題可能是您正在將元素更改為“文本框”而不是“文本”類型。 如果您在HTML標記中聲明的輸入類型為“文本框”,則無論如何它通常都會呈現為文本字段,因為這是默認設置。 但是,將已經有效的“復選框”類型輸入更改為無效的“文本框”可能無法預期。

嘗試將其更改為此:

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();
}

必須有一個更好的方法來做到這一點。 嘗試類似:

  1. 在服務器端了解所有可能的值。 看起來您正在使用PHP; 使用復選框的名稱保留一個簡單的數組。
  2. 當您獲取$ _POST數據時,請從數組中刪除已收到其值的復選框的名稱。
  3. 其余全為假。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM