You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Parsley.js图片上传尺寸验证问题:validate()返回null而非true

问题分析

在Parsley.js中使用异步Promise做图片尺寸验证时,调用validate()返回null而非预期的true,核心原因是**validate()不支持同步返回异步验证的结果**。当表单存在未完成的异步验证任务时,该方法会直接返回null,无法判断最终验证状态。

解决方案

Parsley提供了whenValidate()方法,它返回一个Promise,会在所有同步、异步验证完成后,resolve出验证是否通过的布尔值(true/false)。我们需要用这个方法替代validate()来处理异步验证场景。

另外注意原验证器中的尺寸判断逻辑:使用>/<会排除等于最小/最大尺寸的情况,建议改为>=/<=以符合常规的尺寸校验需求。

修改后的完整代码

HTML代码

<h1>Parsly JS Custom Validation</h1>
<form id="addForm" data-parsley-validate>
  <input type="file" name="logo" id="logo-input-image" class="form-control" accept="image/*" data-parsley-trigger="change" data-parsley-dimensions="true" data-parsley-dimensions-options='{"min_width": 120, "max_width": 500, "min_height": 120, "max_height": 500}' data-parsley-dimensions-options-message="This image should have width between 120-500px and height between 120-500px!">

  <button type="submit" id="submit" class=""> Submit</button>
</form>

<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/parsley.js/2.9.2/parsley.min.js"></script>

JS代码

window.Parsley.addValidator("dimensions", {
    requirementType: {
        min_width: "number",
        max_width: "number",
        min_height: "number",
        max_height: "number",
    },
    validateString: function (_value, params, parsleyInstance) {
        let file = parsleyInstance.$element[0].files;
        let options = parsleyInstance.domOptions.dimensionsOptions;

        let image = new Image();
        let deferred = $.Deferred();

        let _URL = window.URL || window.webkitURL;
        image.src = _URL.createObjectURL(file[0]);

        image.onload = function () {
            // 调整为包含等于的边界判断
            if (
                image.width >= options.min_width &&
                image.width <= options.max_width &&
                image.height >= options.min_height &&
                image.height <= options.max_height
            ) {
                deferred.resolve();
            } else {
                deferred.reject();
            }
        };

        // 处理图片加载失败的异常情况
        image.onerror = function() {
            deferred.reject("Failed to load image");
        };

        return deferred.promise();
    },
    messages: { en: "Image dimensions must be between 120-500px (width) and 120-500px (height)" },
});

$("#submit").click(function (evt) {
    evt.preventDefault();
  
    // 使用whenValidate()处理异步验证结果
    $("#addForm").parsley().whenValidate()
      .then(function(isValid) {
        console.log(isValid);
        if (isValid) {
            $("#addForm").submit();
        }
      })
      .catch(function() {
        console.log("Validation failed");
      });
});
关键说明
  • whenValidate()会等待所有异步验证完成后返回结果,完美适配Promise类型的自定义验证器。
  • 添加image.onerror处理,避免图片加载失败时验证流程卡住。
  • 调整尺寸判断逻辑和提示文案,使其更贴合实际业务需求。

内容的提问来源于stack exchange,提问作者Malik Waris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 22:47:04