2011-09-21 171 views
0

我試圖通過對當複選框無論是在選中狀態,或者如果它不檢查的值。選中/取消複選框

但是,它不會出現通過非選中狀態。我使用的代碼如下:

if (document.getElementById('PRODUCT_REVIEW_EMAILS_FIELD').checked == true){ 
      document.getElementById('PRODUCT_REVIEW_EMAILS_FIELD').value = 'on'; 
      } 
     else { 
      document.getElementById('PRODUCT_REVIEW_EMAILS_FIELD').value = 'off'; 
      } 

我增加了一個警告:

alert(document.getElementById('PRODUCT_REVIEW_EMAILS_FIELD').value); 

其出人意料地表現出「關閉」值 - 然而 - 這不是順利通過。

我錯過了什麼?

+1

注意:當提交表單時,未經檢查的字段不會發布值。 –

+0

你如何確定它沒有成功通過?你在檢查發佈的數據嗎? –

+0

感謝您的快速響應,約翰!好吧,如果我想將空值傳遞給此字段而不是「開啓」 - 那可能嗎? –

回答

2

這是正常的,預期的和明確的行爲。

  • 複選框有任意的value;
  • 當複選框的checked屬性上,它被提交爲與該值的形式的一部分;
  • 當複選框的checked屬性是關閉的,它是不是在所有提交。

HTML 4.01 says

複選框(和單選按鈕)爲開/關開關,其可以由用戶進行切換。當控件元素的checked屬性被設置時,開關處於「on」狀態。提交表單時,只有「開啓」複選框控件才能成功。

And

當用戶提交一個形式(例如,通過激活一個提交按鈕),如下所述用戶代理處理它。

  • 步驟一:確定成功控制
  • 第二步:建立一個表格的數據集 表單數據集是從成功控制構造的控制名/電流 - 值對的序列。 [..]

HTML5 says similar things


你可以寫你的後端代碼期待領域具有一定的名字,並做出相應的反應,他們丟失的情況。

1

您可以處理一個複選框這樣的開/關值真(時複選框開啓和關閉將發佈)。基本上這使用一個名爲PRODUCT_REVIEW_EMAILS_FIELD的隱藏表單字段,並用值填充它。隱藏的表單域始終發佈。

<form> 
    <input id="tempCheckbox" type="checkbox" name="Temp_PRODUCT_REVIEW_EMAILS_FIELD"> 
    <input id="checkboxvalue" type="hidden" name="PRODUCT_REVIEW_EMAILS_FIELD" value="Off"> 
</form> 

<script type="text/javascript"> 
    document.getElementById("tempCheckbox").onclick = function() { 
    if (this.checked) { 
     document.getElementById("checkboxvalue").value = "On"; 
    } 
    else { 
     document.getElementById("checkboxvalue").value = "Off"; 
    } 
    } 
    // used to run on page load to verify the correct value is set incase your server side 
    // script defaults the checkbox to on 
    document.getElementById("tempCheckbox").onclick(); 
</script> 
+0

我不會使用術語「臨時」,但否則是。 –

0

你可以在服務器端做到這一點,所以不要在JavaScript上進行中繼。 要做到這一點,您必須在每個複選框之前添加一個參考輸入字段。

<form> 
    <input type="hidden" name="checkboxes" value="reference"/> 
    <input type="checkbox" name="checkboxes" value="checked"/> 
</form> 

這將使參數進來值的數組:「參考檢查」序列,如果複選框被選中,只是「參考」,如果它沒有被選中。你可以有任意數量的這種複選框,這不會影響你的邏輯。

現在用於服務器端。假設你得到你的「複選框」作爲一個String數組,這裏的邏輯(在Java中)來解析值:

List<Boolean> parsed = new ArrayList<Boolean>(); 
for (int i = 0; i < checkboxes.length; i++) { 
    if (i < checkboxes.length - 1 && "checked".equals(checkboxes[i + 1])) { 
     parsed.add(true); 
     i++; 
    else { 
     parsed.add(false); 
    } 
} 

現在你有布爾的一個很好的陣列相關的訂單,數量和狀態複選框,你有。