【问题标题】:JQuery Validate input file typeJQuery 验证输入文件类型
【发布时间】:2023-03-15 01:43:01
【问题描述】:

我有一个可以包含 0-数百个 <input type="file"> 元素的表单。我根据动态添加到页面的数量来按顺序命名它们。

例如:

<input type="file" required="" name="fileupload1" id="fileupload1">
<input type="file" required="" name="fileupload2" id="fileupload2">
<input type="file" required="" name="fileupload3" id="fileupload3">
<input type="file" required="" name="fileupload999" id="fileupload999">

在我的 JQuery 中,我想在可接受的 MIME/文件类型上验证这些输入。像这样:

$("#formNew").validate({
    rules: {
        fileupload: {
            required: true, 
            accept: "image/jpeg, image/pjpeg"
        }
    }

我的问题是输入文件元素的name 属性是动态的。它必须是动态的,这样我的 Web 应用程序才能正确处理每次上传。所以显然在规则部分使用“fileupload”是行不通的。

如何为所有名称为“fileupload”的输入设置规则?

这是动态添加输入的代码:

var filenumber = 1;
$("#AddFile").click(function () { //User clicks button #AddFile
    $('<li><input type="file" name="FileUpload' + filenumber + '" id="FileUpload' + filenumber + '" required=""/> <a href="#" class="RemoveFileUpload">Remove</a></li>').prependTo("#FileUploader");
    filenumber++;
    return false;
});
$("#FileUploader").on('click', '.RemoveFileUpload', function () { //Remove input
    if (filenumber > 0) {
        $(this).parent('li').remove();
        filenumber--;
    }
    return false;
});

【问题讨论】:

    标签: jquery jquery-validate


    【解决方案1】:

    添加一个元素,使用rules方法添加规则

    //bug fixed thanks to @Sparky
    $('input[name^="fileupload"]').each(function () {
        $(this).rules('add', {
            required: true,
            accept: "image/jpeg, image/pjpeg"
        })
    })
    

    演示:Fiddle


    更新

    var filenumber = 1;
    $("#AddFile").click(function () { //User clicks button #AddFile
        var $li = $('<li><input type="file" name="FileUpload' + filenumber + '" id="FileUpload' + filenumber + '" required=""/> <a href="#" class="RemoveFileUpload">Remove</a></li>').prependTo("#FileUploader");
    
        $('#FileUpload' + filenumber).rules('add', {
            required: true,
            accept: "image/jpeg, image/pjpeg"
        })
    
        filenumber++;
        return false;
    });
    

    【讨论】:

    • 非常感谢 Arun。但是只要用户按下按钮,就会动态添加/删除元素。可能没有,或 1,或其他。我何时/在何处将其添加到规则方法中?我尝试在表单提交事件中添加它,但它不起作用。
    • 阿伦,这是一个已知的情况。也许您应该向 GitHub 上的 jQuery Validate 开发人员发布错误报告...当针对多个目标时,此插件的方法始终需要包含在 .each() 中:jsfiddle.net/8dAU8/3 ~ 同时,您应该修复或删除第一个你的答案的一半。
    • As per documentation for .rules('add') method: "添加指定规则并返回第一个匹配的元素的所有规则。" ~ 另见this GitHub thread
    • @volumeone,撇开小细节不谈,这里唯一相关的一点是你使用.rules('add') 你的click处理程序创建元素后立即。这基本上就是全部答案。
    • @volumeone,看我的回答。
    【解决方案2】:

    所以,我遇到了同样的问题,遗憾的是,只是添加规则并没有奏效。我发现默认情况下,accept: 和 extension: 不是 JQuery validate.js 的一部分,它需要一个附加的Methods.js 插件才能使其工作。

    因此,对于关注此主题但仍然无效的其他人,您可以尝试在上面的答案之外添加additional-Methods.js 到您的标签中,它应该可以工作。

    【讨论】:

    • 一直在挠头试图让文件验证工作,谢谢你的回答!
    • 我可能错了,但截至今天(21 年 12 月 3 日),您似乎不需要那个额外的“additional-methods.js”文件。至少对我来说不是。
    【解决方案3】:

    在创建元素后立即使用the .rules('add') method...

    var filenumber = 1;
    $("#AddFile").click(function () { //User clicks button #AddFile
    
        // create the new input element
        $('<li><input type="file" name="FileUpload' + filenumber + '" id="FileUpload' + filenumber + '" /> <a href="#" class="RemoveFileUpload">Remove</a></li>').prependTo("#FileUploader");
    
        // declare the rule on this newly created input field        
        $('#FileUpload' + filenumber).rules('add', {
            required: true,  // <- with this you would not need 'required' attribute on input
            accept: "image/jpeg, image/pjpeg"
        });
    
        filenumber++; // increment counter for next time
    
        return false;
    });
    
    • 您仍然需要使用 .validate() 在 DOM 就绪处理程序中初始化插件。

    • 您仍然需要使用 .validate() 为静态元素声明规则。页面加载时表单中的任何输入元素......在.validate() 中声明它们的规则。

    • 您不需要使用.each(),当您只定位一个元素并将jQuery 选择器附加到.rules() 时。

    • 当您使用.validate().rules('add') 声明required 规则时,您不需要输入元素上的required 属性。无论出于何种原因,如果您仍然需要 HTML5 属性,至少使用正确的格式,例如 required="required"

    工作演示:http://jsfiddle.net/8dAU8/5/

    【讨论】:

    • 我已经尝试过了,Firebug 显示错误“TypeError: s is undefined”并且表单中断,因此提交按钮不起作用。网页本身没有显示错误。
    • 我更新了 jsfiddle,所以你可以看到问题 jsfiddle.net/8dAU8/4 尝试添加一个 txt 或 zip 文件,它不会显示任何错误。
    • @volumeone,我的错。在声明规则之前,您不能增加计数器。请注意,我删除了一堆多余的代码......见:jsfiddle.net/8dAU8/5
    • stackoverflow.com/users/594235/sparky - 所以我注意到验证不会在添加文件的更改时更新...如果再次激活输入或单击提交按钮,它会更新。有没有办法在更改时更新验证消息以不处于错误状态?
    • @isaacweathers,当您需要触发新的验证测试时,您可以手动调用.valid() 方法。
    猜你喜欢
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    相关资源
    最近更新 更多