如何从独立函数调用Dropzone的processQueue()?表单验证场景
我来帮你搞定这个问题!你遇到的核心问题有两个:一是文件没有被加入Dropzone的上传队列(因为你设置了autoQueue: false),二是要确保在FormValidation的回调里能正确访问到Dropzone实例并触发上传。
第一步:修复Dropzone的文件队列问题
你设置了autoQueue: false,这意味着用户选择/拖拽文件后,文件不会自动加入上传队列——这就是为什么你调用processQueue()时毫无反应,因为队列是空的。需要在Dropzone的init方法里添加监听,把新添加的文件手动加入队列:
Dropzone.autoDiscover = false; var previewNode = document.querySelector("#template"); previewNode.id = ""; var previewTemplate = previewNode.parentNode.innerHTML; previewNode.parentNode.removeChild(previewNode); // 把myDropzone设为全局变量,方便后续回调直接访问 window.myDropzone = new Dropzone('#drop-target', { url: "/processors/form-upload-files.html", previewTemplate: previewTemplate, autoQueue: false, previewsContainer: "#previews", clickable: ".fileinput-button", autoProcessQueue: false, uploadMultiple: true, init: function() { var dzInstance = this; // 保存当前Dropzone实例的引用 // 监听文件添加事件,手动将文件加入队列 this.on("addedfile", function(file) { dzInstance.enqueueFile(file); }); // 你原有init方法里的其他逻辑可以保留在这里 } });
第二步:在FormValidation回调中正确触发上传
现在队列里已经有文件了,接下来在FormValidation验证通过的回调里,直接使用全局的myDropzone实例调用processQueue()即可:
$(function() { FormValidation.formValidation( document.getElementById('fm-contact'), { fields: { user_name: { validators: { notEmpty: { message: 'What should we call you?' } } } // 其他验证规则保留 } } ) .on('core.form.valid', function() { // 先检查队列里是否有文件需要上传 if (window.myDropzone.getQueuedFiles().length > 0) { window.myDropzone.processQueue(); } else { // 如果没有文件,这里可以处理纯表单提交的逻辑(如果需要) console.log("没有文件需要上传,直接提交表单"); // document.getElementById('fm-contact').submit(); } }); });
为什么之前的尝试失败?
- 你之前调用
myDropzone.getQueuedFiles()返回空数组,不是实例访问不到,而是autoQueue: false导致文件根本没被加入队列; - 那些用
Dropzone.forElement("#drop-target")的尝试其实能获取到实例,但同样因为队列是空的,所以调用processQueue()没反应; - 重新创建Dropzone实例会报错"Dropzone already attached",因为DOM元素已经绑定过Dropzone,不能重复初始化。
这样调整后,当表单验证通过时,Dropzone就会自动处理队列里的文件上传了。
内容的提问来源于stack exchange,提问作者chris.dempsey
相关产品推荐
相关产品推荐

