jQuery文件上传:是否可以通过提交按钮触发上传?

kop*_*por 26 jquery jquery-plugins

我正在使用jQuery文件上传基于AJAX的上传.它总是在选择文件后开始上传.是否可以更改行为以使用"提交"按钮?我知道问题#35,但选项beforeSend似乎已被删除.

我使用的是Basic Plugin,而不是完整版.

也许我应该按照建议切换到基于XHR的简单上传:jQuery Upload Progress和AJAX文件上传.

iny*_*nye 47

如果你有按钮

<button id="up_btn">Upload</button>
Run Code Online (Sandbox Code Playgroud)

你可以试试

$('#fileupload').fileupload({
    dataType: 'json',
    add: function (e, data) {            
        $("#up_btn").off('click').on('click', function () {
            data.submit();
        });
    },
});
Run Code Online (Sandbox Code Playgroud)

编辑:根据评论更好的答案考虑off避免重复的请求.(也工作unbind,我不检查是否是bind,unbind但jquery团队推荐onoff 链接自1.7)

  • 这将有助于防止重复请求:`$("#imgupload").unbind('click').on('click',function(){data.submit();});`as @zykadelic建议 (5认同)
  • 这不允许上传多个文件.对于多文件上传,为所有选定文件调用add函数,因此它删除了先前文件的click事件,最后执行了最后一次注册的click事件 (3认同)
  • 确保#up_btn按钮不在#fileupload形式中. (2认同)
  • 您也可能希望使用`one`而不是`on`(并重新提交事后提交)以避免重复请求 (2认同)

Jef*_*yan 9

这些答案都不适用于多个文件上传.我的案例涉及在评论帖子中允许多个附件.所以我需要先保存评论以获取ID,然后上传并保存所有附件.这看起来像是一件微不足道的事情,但使用这个插件并不是那么直观.我的解决方案在jQuery中使用自定义事件,效果很好.

当前接受的答案绑定到"添加"回调中按钮的单击事件,但是对每个文件调用一次"添加"回调.如果您每次仅取消绑定所有事件,则仅上载最后一个文件.

$('#fileupload').fileupload({
    dataType: 'json',
    add: function (e, data) {
        $("#up_btn").on('customName', function (e) {
            data.submit();
        });
    },
});
Run Code Online (Sandbox Code Playgroud)

通过将提交按钮绑定到自定义名称,我们可以在提交图像之前进行任何我们想要的预处理.在我的情况下,它涉及提交评论并取回我在单独电话中所做的评论ID.此代码只响应单击,但您可以在触发事件之前执行任何操作.

$("#up_btn").on('click', function (e) {
    e.preventDefault();
    $("#up_btn").trigger( "customName");
});
Run Code Online (Sandbox Code Playgroud)

您可以在触发事件时传递所需的任何数据,因此它可以让您完全控制您的表单.


Phi*_*Lee 6

您也可以在jquery.fileupload.js中找到

第142行有一个'autoUpload'选项.

uploadedBytes: undefined,
// By default, failed (abort or error) file uploads are removed from the
// global progress calculation. Set the following option to false to
// prevent recalculating the global progress data:
recalculateProgress: true,
// Interval in milliseconds to calculate and trigger progress events:
progressInterval: 100,
// Interval in milliseconds to calculate progress bitrate:
bitrateInterval: 500,
// By default, uploads are started automatically when adding files:
autoUpload: true    // <<---------- here
Run Code Online (Sandbox Code Playgroud)