最近在研究 jQuery.Validate,這是可以讓你做出「表單還沒送出前就先驗證資料是否正確」效果的 Plug-in,如果網站的 JavaScript 已經採用 jQuery 當作 Library 的話,那麼直接導入 jQuery.Validate 是比較容易的。類似的 Library 如 LiveValidation

示範網頁在這裡;因為 WordPress 不讓我放 Embedded Javascript,所以就到另一個網頁看吧。

做法很簡單:先導入 jQuery.Validate,然後針對要輸入身份證字號的地方,撰寫兩個自定的 Validate 條件,一個是檢驗它是否符合 /^[A-Z]{1}[1-2]{1}[0-9]{8}$/ 的 Regular Expression,另一個是透過算數方式檢查它是否符合邏輯。

首先導入 jQuery 及 jQuery.Validate,這個應該不用多說:

[sourcecode language=”html”]
<script type="text/javascript" src="/path/to/jquery.js"></script>
<script type="text/javascript" src="/path/to/jquery.validate.js"></script>
[/sourcecode]

以下是一個範例的表單,表單的 id 不能省略,inputid 也不能省略:

[sourcecode language=”html”]
<form id="citizenid_validation" action="some_action.php" method="get">
<input type="text" name="citizenid" value="" id="citizenid">
</form>
[/sourcecode]

接著在 JavaScript 裡定義兩個驗證方案,一個是驗證它是否符合/^[A-Z]{1}[1-2]{1}[0-9]{8}$/ 的 Regular Expression:

[sourcecode language=”javascript”]
$(document).ready (function () {
/* user_citizenid regex method */

jQuery.validator.addMethod(&quot;ROC_Citizen_ID_regex&quot;,

  function(citizenid, element) {<br />
    citizenid = citizenid.replace(/\s+/g, &quot;&quot;);

    return (<br />
        this.optional(element) ||<br />
        /^[A-Z]{1}[1-2]{1}[0-9]{8}$/.test(citizenid)<br />
      );<br />
  }, &quot;格式有誤&quot;<br />
);<br />   });<br /> [/sourcecode]

另一個是以算數方式檢驗:

[sourcecode language=”javascript”]
$(document).ready (function () {
jQuery.validator.addMethod("ROC_Citizen_ID_arithmetic",
function(citizenid, element) {

      var local_table = [10,11,12,13,14,15,16,17,34,18,19,20,21,<br />
                         22,35,23,24,25,26,27,28,29,32,30,31,33];<br />
                     /* A, B, C, D, E, F, G, H, I, J, K, L, M,<br />
                        N, O, P, Q, R, S, T, U, V, W, X, Y, Z */

    var local_digit = local_table[citizenid.charCodeAt(0)-'A'.charCodeAt(0)];

    var checksum = 0;

    checksum += Math.floor(local_digit / 10);<br />
    checksum += (local_digit % 10) * 9;

    /* i: index; p: permission value */<br />
    /* this loop sums from [1] to [8] */<br />
    /* permission value decreases */

    for (var i=1, p=8; i &lt;= 8; i++, p--)<br />
    {<br />
      checksum += parseInt(citizenid.charAt(i)) * p;<br />
    }

    checksum += parseInt(citizenid.charAt(9));    /* add the last number */

    return (<br />
        this.optional(element) || !(checksum % 10)<br />
      );<br />
  }, &quot;似乎偽造&quot;<br />
);<br />   });<br /> [/sourcecode]

最後,把 jQuery.Validate 的規則綁定到表單元件 (form element) 就行了:

[sourcecode language=”javascript”]
$(document).ready(function () {
$("#citizenid_validation").validate ({
success: function(label) {
label.text("正確")
},
rules: {
citizenid: {
required: true,
ROC_Citizen_ID_regex: true,
ROC_Citizen_ID_arithmetic: true
}
}
});
});
[/sourcecode]

當然這三件事可以放在同一個 $(document).ready( function () {/*裡面*/})


by the way, 事實上「身份證字號產生器」是很好寫的,反正前 9 個字可以隨便寫,透過算數方法就可以算出最後一個數字是多少。不信的話,你把前面 9 個字隨便亂填,第 10 個字從 0 到 9 都試試看,一定有一個是正確的…

警告本文描述內容僅為學術研究用途,使用非本人的身份證字號是犯法的