Calvert's murmur

使用 jQuery Validation Plugin 驗證元素陣列

2013-10-20

約 2187 字 / 需 12 分鐘閱讀

有時候我們會需要驗證表單中的元素陣列,例如:

<form id="userDataForm" name="userDataForm" method="post" action="">
  <!-- User 1 -->
  <input type="text" id="userName1" name="userName[]" />
  <input type="text" id="userAddress1" name="userAddress[]" />
  <select id="sex1" name="sex[]">
    <option value="">- 請選擇 -</option>
    <option value="1"></option>
    <option value="0"></option>
  </select><!-- User 2 -->
  <input type="text" id="userName2" name="userName[]" />
  <input type="text" id="userAddress2" name="userAddress[]" />
  <select id="sex2" name="sex[]">
    <option value="">- 請選擇 -</option>
    <option value="1"></option>
    <option value="0"></option>
  </select><!-- User N -->
  <input type="text" id="userNameN" name="userName[]" />
  <input type="text" id="userAddressN" name="userAddress[]" />
  <select id="sexN" name="sex[]">
    <option value="">- 請選擇 -</option>
    <option value="1"></option>
    <option value="0"></option>
  </select></form>

現在,使用 jQuery Validation Plugin 來驗證此表單。驗證條件為使用者必須填寫各輸入欄位,驗證語法如下:

<script src="jquery.js"></script>
<script src="jquery.validate.js"></script>
<script>
$(function() {
  $("#userDataForm").validate({
    rules: {
      "userName[]": "required",
      "userAddress[]": "required",
      "sex[]": "required"
    },
    messages: {
      "userName[]": "請輸入姓名",
      "userAddress[]": "請輸入地址",
      "sex[]": "請選擇性別"
    }
  });
});
</script>

使用以上的語法會遇到的問題是 jquery.validate.js 僅有驗證 userName 及 userAddress 陣列的第一個元素,所以我們需要對此插件做點小修改。

開啟 jquery.validate.js,可以找到名為 checkForm 的方法,內容如下:

jquery.validate.js
checkForm: function() { this.prepareForm(); for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) { this.check( elements[i] ); } return this.valid(); }

將此方法修改為如下的內容後,便會驗證陣列中的所有元素。

jquery.validate.js
checkForm: function() { this.prepareForm(); for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) { if ( this.findByName( elements[i].name ).length != undefined && this.findByName( elements[i].name ).length > 1 ) { for ( var j = 0; j < this.findByName( elements[i].name ).length; j++ ) { this.check( this.findByName( elements[i].name )[j] ); } } else { this.check( elements[i] ); } } return this.valid(); }

參考資料:JQuery Validation for Array of Input Elements