usagizmo
12/20/2017 - 12:07 PM

Validate with validate.js

    // validation option
    var constraints = {
      company: {
        presence: {message: '^未入力です。'}
      },
      name: {
        presence: {message: '^未入力です。'}
      },
      email: {
        presence: {message: '^未入力です。'},
        email: {message: '^メールアドレスの形式ではありません。'}
      },
      zip: {
        presence: {message: '^未入力です。'},
        numericality: {message: '^半角数字で入力してください。'}
      },
      address: {
        presence: {message: '^未入力です。'}
      },
      tel: {
        numericality: {message: '^半角数字で入力してください。'}
      }
    }

    var validateCheck = function (name, value) {
      if (!constraints[name]) return
      var get$error = function (name) {
        var $this = $('[name="' + name + '"]')
        if (!$this.next('span.error').length) {
          $this.after('<span class="error"></span>')
        }
        return $this.next('span.error')
      }
      var val = value || null // for validate.js
      if (validate.single(val, constraints[name])) {
        var texts = validate.single(val, constraints[name]).join('<br>')
        get$error(name).html(texts)
      } else {
        get$error(name).remove()
      }
    }

    var namesSelector = map(Object.keys(constraints), function (name) {
      return '[name="' + name + '"]'
    }).join(',')
    $(namesSelector).on('change', function () {
      var $this = $(this)
      var name = $this.attr('name')
      var value = $this.val()
      validateCheck(name, value)
    })

    // set submit button
    $('[data-type-submit]').on('click', function (ev) {
      ev.preventDefault()
      var $button = $(this)
      var $form = $button.closest('form')
      var $submit = $button.find('[type="submit"]')

      each($form.serializeArray(), function (props) {
        validateCheck(props.name, props.value)
      })

      // submit
      if ($('.error').length) {
        $('.error:eq(0)').prev().focus()
      } else {
        $button.off('click')
        $submit.click()
      }
    })
  }