フォームチェック用JS

作った。といっても質の高いのはたくさん世の中に出てるので、勉強用です。
他のライブラリも画像やCSSも必要ないのが作りたかったんです。


エラー出力先のエレメントを用意しておいて、HTMLの最後にでも、
var v = Validator(document.forms["フォーム名"]);
v.add("inputname", "range", "title", "outputID", "1-32");
v.add("inputname", "halfAlpha", "title", "outputID");
としておいて、フォームタグに、
onsubmit="return v.submit()"
とかしておけば、アラートとエラー出力先にエラーメッセージを出力します。


チェックできるのは、空文字、文字長さ、半角英数字、数字、Eメール、JPGファイルな感じです。

function Validator(formobj) {
  this.formElm = formobj;
  this.checkArr = [];
  this.errMsg = "";
}

Validator.prototype = {
  add: function(formName, type, msgTitle, msgElm, opt) {
    this.checkArr.push([formName, type, msgTitle, msgElm, opt]);
  },

  submit: function() {
    this.errMsg = "";
    for(var i = 0; i < this.checkArr.length; i++) {
      if(this.checkArr[i][1] == "range" || this.checkArr[i][1] == "len" || this.checkArr[i][1] == "equal") {
        this[this.checkArr[i][1]](this.checkArr[i][0], this.checkArr[i][4], this.checkArr[i][2], this.checkArr[i][3]);
      } else {
        this[this.checkArr[i][1]](this.checkArr[i][0], this.checkArr[i][2], this.checkArr[i][3]);
      }
    }
    if(this.errMsg != "") {
      this.errMsg = this.errMsg.replace(/(<BR>|<br>)/g, "\n");
      alert(this.errMsg);
      return false;
    } else {
      return true;
    }
  },

  notEmpty: function(formName, msgTitle, msgElm) {
    var str = this.formElm.elements[formName].value;
    var msgObj = document.getElementById(msgElm);
    if(str == null || str.length == 0) {
      msgObj.innerHTML += msgTitle + " が未入力です<br />";
      this.errMsg += msgObj.innerHTML;
    } else {
      msgObj.innerHTML = "";
    }
  },

  number: function(formName, msgTitle, msgElm) {
    var str = this.formElm.elements[formName].value;
    var msgObj = document.getElementById(msgElm);
    var re = /^[0-9]+$/;
    if(!str.match(re)) {
      msgObj.innerHTML += msgTitle + "には、半角数字を入力してください<br />";
      this.errMsg += msgObj.innerHTML;
    } else {
      msgObj.innerHTML = "";
    }
  },

  halfAlpha: function(formName, msgTitle, msgElm) {
    var str = this.formElm.elements[formName].value;
    var msgObj = document.getElementById(msgElm);
    var re = /^[0-9a-zA-Z]+$/;
    if(!str.match(re)) {
      msgObj.innerHTML += msgTitle + "には、半角英数字を入力してください<br />";
      this.errMsg += msgObj.innerHTML;
    } else {
      msgObj.innerHTML = "";
    }
  },

  len: function(formName, num, msgTitle, msgElm) {
    var str = this.formElm.elements[formName].value;
    var msgObj = document.getElementById(msgElm);
    if(str.length != num) {
      msgObj.innerHTML += msgTitle + "は、" + num + "桁ちょうどで入力してください<br />";
      this.errMsg += msgObj.innerHTML;
    } else {
      msgObj.innerHTML = "";
    }
  },

  email: function(formName, msgTitle, msgElm) {
    var str = this.formElm.elements[formName].value;
    var msgObj = document.getElementById(msgElm);
    var re = /^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/;
    if(!str.match(re)) {
      msgObj.innerHTML += msgTitle + "は、メールアドレス形式で入力してください<br />";
      this.errMsg += msgObj.innerHTML;
    } else {
      msgObj.innerHTML = "";
    }
  },

  equal: function(formName, otherForm, msgTitle, msgElm) {
    var pass1 = this.formElm.elements[formName].value;
   var pass2 = this.formElm.elements[otherForm].value;
    var msgObj = document.getElementById(msgElm);
    if(pass1 != pass2) {
      msgObj.innerHTML += "パスワードと確認用パスワードが一致しません<br />";
      this.errMsg += msgObj.innerHTML;
    } else {
      msgObj.innerHTML = "";
    }
  },

  jpg: function(formName, msgTitle, msgElm) {
    var str = this.formElm.elements[formName].value;
    var msgObj = document.getElementById(msgElm);
    var re = /\.(jpg|JPG)$/i;
    if(!str.match(re)) {
      msgObj.innerHTML += msgTitle + "は、jpgもしくはJPGファイルを指定してください<br />";
      this.errMsg += msgObj.innerHTML;
    } else {
      msgObj.innerHTML = "";
    }
  },

  range: function(formName, range, msgTitle, msgElm) {
    var range = range.split("-");
    var str = this.formElm.elements[formName].value;
    var msgObj = document.getElementById(msgElm);
    if(str.length < range[0] || range[1] < str.length) {
      msgObj.innerHTML += msgTitle + "は、" + range[0] + "〜" + range[1] + "文字で入力してください<br />";
      this.errMsg += msgObj.innerHTML;
    } else {
      msgObj.innerHTML = "";
    }
  }
}


チェック関数呼び出しのところがダサすぎるのがうーん。。。