使用jQuery插件验证图像尺寸

时间:2016-07-16 04:05:54

标签: javascript jquery jquery-validate

我有一个表单,在jQuery的验证插件中进行验证。我的表单包含两个元素,一个输入类型=文件和一个提交按钮。用户将选择一个图像,如果该图像小于500px,则不会被接受,并且应显示错误消息。我已经为这个被称为宽度的方法做了一个新方法,但由于某种原因它不起作用。当我尝试提交小于500像素的图像时,不会显示错误消息。这是我的jsfiddle

HTML

<form class="some_form" enctype="multipart/form-data" method="post" action="">
  <input type="file" name="photo" id="photoInput" />
  <input type="submit">
</form>

的jQuery

$.validator.addMethod('width', function(value, element) {
  if ($(element).data('width')) {
    return $(element).data('width') >= 500;
  }

  return true;
}, 'Image needs to be wider than 500px');

$(".some_form").validate({
  rules: {
    photo: {
      required: true,
      width: 500
    }

  },

  messages: {
    photo: {
      required: "You must insert an image",
      width: "Your image's width must be greater than 500px"
    },
  }

});

1 个答案:

答案 0 :(得分:4)

您可以将图像文件加载到<img>元素中,然后获取该元素的宽度。

首先在HTML中添加一个容器元素来保存<img>元素:

<form class="some_form" enctype="multipart/form-data" method="post" action="">
  <input type="file" name="photo" id="photoInput" />
  <input type="submit">
</form>
<div id="imgContainer"></div>

接下来,定义自定义Validator方法:

$.validator.addMethod('minImageWidth', function(value, element, minWidth) {
  return ($(element).data('imageWidth') || 0) > minWidth;
}, function(minWidth, element) {
  var imageWidth = $(element).data('imageWidth');
  return (imageWidth)
      ? ("Your image's width must be greater than " + minWidth + "px")
      : "Selected file is not an image.";
});

注意:

  1. 如您所见,该方法希望通过调用文件输入元素上的.data('imageWidth')来获取图像宽度。我们将在下面显示的代码中设置该值。
  2. 此外,该方法假设当.data('imageWidth')返回undefined时,所选文件不是图像。
  3. 您现在可以使用minImageWidth方法,如下所示:

    var validator = $('.some_form').validate({
      rules: {
        photo: {
          required: true,
          minImageWidth: 500
        }
      },
      messages: {
        photo: {
          required: "You must insert an image"
        },
      }
    });
    

    最后,为文件输入添加一个change-event处理程序,用于创建<img>元素并将其添加到容器中。它还将在文件输入元素上设置.data('imageWidth')值。

    var $submitBtn = $('.some_form').find('input:submit'),
      $photoInput = $('#photoInput'),
      $imgContainer = $('#imgContainer');
    
    $('#photoInput').change(function() {
      $photoInput.removeData('imageWidth');
      $imgContainer.hide().empty();
    
      var file = this.files[0];
    
      if (file.type.match(/image\/.*/)) {
        $submitBtn.attr('disabled', true);
    
        var reader = new FileReader();
    
        reader.onload = function() {
          var $img = $('<img />').attr({ src: reader.result });
    
          $img.on('load', function() {
            $imgContainer.append($img).show();
            var imageWidth = $img.width();
            $photoInput.data('imageWidth', imageWidth);
            if (imageWidth < 500) {
              $imgContainer.hide();
            } else {
              $img.css({ width: '400px', height: '200px' });
            }
            $submitBtn.attr('disabled', false);
    
            validator.element($photoInput);
          });
        }
    
        reader.readAsDataURL(file);
      } else {
        validator.element($photoInput);
      }
    });
    

    注意:

    1. 加载图像时,其宽度将作为.data('imageWidth')值放在文件输入元素上。
    2. 在加载图片时,提交按钮被禁用,因此用户无法提交表单。
    3. 加载图像后立即执行验证。也就是说,用户不必单击提交按钮以显示错误消息。这是通过致电validator.element()来完成的。
    4. 在将<img>元素添加到DOM之前,您无法获得this[aType].apply(this, aParams) 元素的宽度。它也必须是可见的,但上面的代码显示了如果需要可以立即隐藏它。
    5. <强> jsfiddle

      参考文献:

相关问题