解决AJAX表单用POST方式提交Checkbox复选框的问题

用AJAX的POST方式提交表单,函数如下:

  
  
  
  
  1. function createXMLHttp() 
  2.     { 
  3.      var xmlhttp = false
  4.      try 
  5.      { 
  6.       xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); 
  7.      } 
  8.      catch (e) 
  9.       { 
  10.       try 
  11.       { 
  12.        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
  13.       } 
  14.       catch (E) 
  15.       { 
  16.        xmlhttp = false
  17.       } 
  18.      } 
  19.  
  20.      if (!xmlhttp && typeof XMLHttpRequest != 'undefined'
  21.      { 
  22.       xmlhttp = new XMLHttpRequest(); 
  23.      } 
  24.  
  25.      return xmlhttp; 
  26.     } 
  27.  
  28.     function getRequestBody(oForm) 
  29.     { 
  30.      var aParams = new Array(); 
  31.  
  32.      for (var i=0 ; i < oForm.elements.length; i++) 
  33.      { 
  34.       var sParam = encodeURIComponent(oForm.elements[i].name); 
  35.       sParam += "="
  36.       sParam += encodeURIComponent(oForm.elements[i].value); 
  37.       aParams.push(sParam); 
  38.      } 
  39.  
  40.      return aParams.join("&"); 
  41.     } 
  42.  
  43.     function sendPostRequest() 
  44.     { 
  45.      var oForm = document.forms[0]; 
  46.      var sBody = getRequestBody(oForm); 
  47.  
  48.      var xmlhttp = createXMLHttp(); 
  49.      xmlhttp.open("POST", oForm.action, true); 
  50.  
  51.      xmlhttp.setRequestHeader("Content-Type""application/x-www-form-urlencoded"); 
  52.  
  53.      xmlhttp.onreadystatechange = function() 
  54.      { 
  55.       if (xmlhttp.readyState == 4) 
  56.       { 
  57.        if (xmlhttp.status == 200) 
  58.        { 
  59.         // success 
  60.        } 
  61.        else 
  62.        { 
  63.         // failed 
  64.        } 
  65.       } 
  66.      }; 
  67.  
  68.      xmlhttp.send(sBody); 
  69.     } 

一个含有复选框的表单:

  
  
  
  
  1. <form id="Reg-form" name="Reg-form" onsubmit="sendPostRequest(); return false;"  
  2.   action="submit.php" method="post" encType="multipart/form-data"> 
  3.   <input type="checkbox" name="os[]" value="1" autocomplete="off">Linux<br> 
  4.   <input type="checkbox" name="os[]" value="2" autocomplete="off">Mac OS<br> 
  5.   <input type="checkbox" name="os[]" value="3" autocomplete="off">Windows<br> 
  6.   <input id="submit" type="submit" value="Submit" name="submit"> 
  7.   </form> 

直接用浏览器提交,服务器端的$_POST['os']只有选中项的值,但用sendPostRequest()提交,不管是否选中选项,$_POST['os']永远包含所有选项的值。

针对这个问题,常见的解决方法是不使用POST方式,而用GET方式来提交表单,比如这篇文章:
http://www.captain.at/howto-ajax-form-post-get.php

既然AJAX总是提交所有选项的值,那就把选项的值默认设为空,当选中的时候再赋值,就能保证服务器端只接收到选中项的值了。

方法是用一个函数来设置选项的值,把选项的值先保存在alt属性中:

  
  
  
  
  1. <form id="Reg-form" name="Reg-form" onsubmit="sendPostRequest(); return false;"  
  2.     action="submit.php" method=post encType=multipart/form-data> 
  3.     <input type="checkbox" name="os[]" alt="1" value="" autocomplete="off" onclick="checkboxValue(this);">Linux<br> 
  4.     <input type="checkbox" name="os[]" alt="2" value="" autocomplete="off" onclick="checkboxValue(this);">Mac OS<br> 
  5.     <input type="checkbox" name="os[]" alt="3" value="" autocomplete="off" onclick="checkboxValue(this);">Windows<br> 
  6.     <input id="submit" type="submit" value="Submit" name="submit"> 
  7.     </form> 
  8.     <script language="JavaScript"> 
  9.     function checkboxValue(obj) 
  10.     { 
  11.      if(obj.checked) 
  12.      { 
  13.       objobj.value = obj.alt; 
  14.      } 
  15.      else 
  16.      { 
  17.       obj.value = ""
  18.      } 
  19.     } 
  20.     </script> 

 

你可能感兴趣的:(Ajax,表单,职场,复选框,休闲)