【问题标题】:disable submit button until file selected for upload禁用提交按钮,直到选择要上传的文件
【发布时间】:2026-01-05 09:25:02
【问题描述】:

我有一个用于上传图片的表单。我想禁用提交按钮,直到用户选择要上传的图像。我想用 jQuery 来做。目前我有一个 JavaScript 函数,通过在提交时禁用它来防止用户多次提交表单。最好将此功能与新功能结合起来。

这是我现在得到的:

<script type="text/javascript">
function submitonce(theform) {
    //if IE 4+ or NS 6+
    if (document.all || document.getElementById) {
        //screen thru every element in the form, and hunt down "submit" and "reset"
        for (i = 0; i < theform.length; i++) {
            var tempobj = theform.elements[i]
            if (tempobj.type.toLowerCase() == "submit" || tempobj.type.toLowerCase() == "reset")
            //disable em
            tempobj.disabled = true
        }
    }
}
</script>
<form name="form" enctype="multipart/form-data" method="post" action="upload.php" onSubmit="submitonce(this)">
 <input type="file" name="my_field" value="" />
 <input type="submit">
</form>

【问题讨论】:

    标签: jquery file-upload webforms


    【解决方案1】:

    以下似乎在 Chrome 和 Firefox (Ubuntu 10.10) 中运行可靠,我目前无法在其他平台上检查:

    jQuery

    $(document).ready(
        function(){
            $('input:file').change(
                function(){
                    if ($(this).val()) {
                        $('input:submit').attr('disabled',false);
                        // or, as has been pointed out elsewhere:
                        // $('input:submit').removeAttr('disabled'); 
                    } 
                }
                );
        });
    

    html

    <form action="#" method="post">
        <input type="file" name="fileInput" id="fileInput" />
        <input type="submit" value="submit" disabled />
    </form>
    <div id="result"></div>
    

    Demo at JS Fiddle.

    【讨论】:

    • 谢谢,我喜欢这个解决方案的简单性。提交表单后如何修改以再次禁用提交按钮?
    • 好的,知道了。我添加了以下函数: $("#uploadForm").submit(function(){ $("input[type=submit]", this).attr("disabled", "disabled"); });
    • 我相信如果你这样写条件会更好: $('.upload-pm-btn').attr('disabled', !$(this).val() );这样,当您稍后从文件上传中删除该值时,该按钮将再次被禁用。
    • Bug:如果取消选择文件,按钮会保持活动状态!
    【解决方案2】:

    使用 prop() 的稍微简单的方法,我认为这是现在的首选方法:

    $('input:file').on("change", function() {
        $('input:submit').prop('disabled', !$(this).val()); 
    });
    

    在 IE、Chrome 和 FireFox 中测试。

    【讨论】:

    • 这很好用,因为如果取消选择文件,它会得到按钮disabled
    • 这看起来(在我公认的 jQuery 挑战眼中)会禁用给定表单上的所有提交按钮,该表单具有空文件上传控件?在 OP 的示例中很好,但如果有多个提交或多个文件上传控件可能值得一提?
    【解决方案3】:

    试试

       $('#my_uploader').change(function() {
          if($(this).val()) {
            $('#my_submit_button').attr('disabled', '');
          } else {
            $('#my_submit_button').attr('disabled', 'disabled');
          }
        });
    

    【讨论】:

    • disabled 属性正确地是一个布尔值;我建议使用.attr('disabled',true') / .attr('disabled',false)
    • 你应该使用 .removeAttr("disabled")
    • 这是一个显而易见的观点,@hunter,我感到羞耻,在你指出之前我从来没有想过(老实说,我不是(我的耻辱) 搞笑)... =/ +1
    • 在 HTML 中的布尔属性如 disabled 和 readonly 只能合法地取属性名。例如。 disabled="disabled" readonly="readonly" 然而,大多数浏览器都接受该属性的任何值作为同义词。所以以下是等价的: disabled="disabled" disabled disabled="true" disabled="no" w3.org/TR/REC-html40/intro/…
    【解决方案4】:

    如果现在(2021 年)有人在看这个,这是我能够想出的非 jquery 解决方案!!其中一些不适用于较旧的浏览器,因此您的里程可能会有所不同 - 但如果您正在寻找一个现代简单的解决方案 - 这应该很好。

    <div>
      <form method="post" action="someAction" enctype="multipart/form-data">
        <input type="file" name="fileUploaded" />
        <input type="submit" disabled="true" />
      </form>
      <script>
        document.querySelector("input[type=file]").onchange = ({
          target: { value },
        }) => {
          document.querySelector("input[type=submit]").disabled = !value;
        };
      </script>
    </div>
    

    关于此解决方案的一些注意事项:onChange 采用一个函数,该函数返回一个对象event,其中包含targetvaluevalue为上传文件名字符串,用户取消选择时返回空字符串。


    如果您正在寻找一种适用于多个文件输入和提交的解决方案,您可以使用类名来获取正确的。

    <!-- index.html -->
    <div>
      <form
        method="post"
        action="someAction"
        enctype="multipart/form-data"
      >
        <input class="fileUpload1" type="file" name="fileUploaded" />
        <input class="fileUpload1" type="submit" disabled="true" />
      </form>
    </div>
    <div>
      <form
        method="post"
        action="someOtherAction"
        enctype="multipart/form-data"
      >
        <input class="fileUpload2" type="file" name="fileUploaded2" />
        <input class="fileUpload2" type="submit" disabled="true" />
      </form>
    </div>
    
    // script.js
    document.querySelectorAll("input[type=file]").forEach(
      (fileInput) =>
        (fileInput.onchange = ({ target: { value } }) => {
          document.querySelector(
            `input[type=submit].${fileInput.className}`
          ).disabled = !value;
        })
      );
    

    【讨论】:

    • 这很有用——尽管值得承认的是原始问题明确要求使用 jQuery,因此这回答了一个没有被问到的问题。
    • 你是绝对正确的,问题描述要求“我想在 jQuery 中做”......但是,目前尚不清楚是否需要使用 jQuery,或者它是否正在天真地问 - 假设纯 js 解决方案不会优雅。希望这个例子表明可以实现纯 js 解决方案,并且(因为它仍然是 JavaScript)与使用中的 jQuery 库完全兼容。此外,与所选解决方案不同,如果取消选择,此解决方案会再次正确禁用按钮。
    • 我认为同样重要的是要注意最初的问题是十多年前提出的,但由于这是在 JavaScript 中禁用表单按钮的谷歌搜索结果之一,希望这有助于人们寻找一个解决方案,即使你是正确的,它不完全适合?
    【解决方案5】:

    如果你喜欢三元表达式:

    $(document).ready(function(){
        var $submit = $('#submit_document');
        var $file = $('#file_path');
    
        $file.change(
            function(){
                $submit.attr('disabled',($(this).val() ? false : true));
            }
        );
    });  
    

    【讨论】:

      【解决方案6】:

      如果用户在没有先选择文件的情况下按下它,提供指令是否可能更有帮助,而不是禁用提交?那么添加这样的东西作为提交的onclick代码?

      var bFileEmpty = !document.getElementById('filControl').value; if (bFileEmpty) alert('Please select a file'); return !bFileEmpty;
      

      请注意,您的文件控件需要一个 ID 和一个名称

      【讨论】:

        【解决方案7】:

        不使用脚本,只需在输入字段中使用 required

        【讨论】: