【发布时间】:2014-11-07 19:04:13
【问题描述】:
使用dropzone.js进行拖放文件上传,我想动态附加一个文件上传按钮。
该页面有一个订单列表。当您选择一个订单时,它会通过 Ajax 调用加载并显示出来。我在页面加载时在 document.body 上实例化 Dropzone,以便在选择订单之前拒绝上传并显示友好的错误消息。加载订单后,将使用订单呈现上传按钮,我想将 Dropzone 点击处理程序附加到这个动态创建的按钮。每次选择新订单时都会重新创建该按钮。
在创建 Dropzone 后,我似乎不知道如何设置/更改 clickable Dropzone 选项。
var documentDropzone = new Dropzone(document.body, {
url: '/path/to/upload.php',
clickable: false,
init: function() {
this.on('sending', function(file, xhr, formData) {
var order_id = parseInt($('#dropzone_order_id').val(), 10);
formData.append('order_id', order_id);
});
},
accept: function(file, done) {
if (parseInt($('#dropzone_order_id').val(), 10)) done();
else {
showErrorMessage('Please select an order first');
done('error');
}
},
success: function(file, response) {
// handle response
}
});
$(document).on('click', '.view-opener', function(event) {
event.preventDefault();
$('#view-order').remove();
var view = $('<div id="view-order"></div>')
.prependTo('#inner-container-top');
view.load(this.href, function(){
// This is the failing line of code. The #dropzone-click-target
// is a button that is loaded with this ajax call.
// (It also contains a hidden input with #dropzone_order_id
// which enables the upload functionality.)
Dropzone(document.body, {clickable: '#dropzone-click-target'});
});
});
这里有一个小提琴:
【问题讨论】:
-
您是否尝试过将
autoProcessQueue设置为false,然后在您的自定义点击处理程序中运行processQueue? -
@elzi 我认为这不会实现我的目标。我在选择订单之前实例化 Dropzone 的原因是因为我想优雅地处理用户在选择订单之前不小心将文件拖放到窗口上的情况。对于许多文件类型,例如 PDF,它很可能会由浏览器显示并替换当前屏幕,如果屏幕上有大量未保存的数据,这可能是灾难性的。我不想将文件排入队列并将它们全部上传到下一个选定的订单中。我想拒绝上传。
-
我明白了。我试着弄乱了一点,在选择水果之后更改了`myDropzone.options.clickable = true;`,但是单独这样做并不能设置事件监听器。我会浏览 Dropzones 代码并查找
if ( clickable)以查看运行的内容。您可以通过最初覆盖发泄监听器,然后在选择水果后解除绑定来做一个 hacky 解决方案。 -
@elzi 谢谢,你促使我真正深入研究源代码(我一直试图避免的事情)并找到了一个“解决方案”。 Dropzone 对象的
init()方法将设置点击处理程序,clickableElements数组实际上是公开的。 -
干得好!我很确定这会导致正确的解决方案。如果你想出一个优雅的解决方案,你应该在他们的 git repo 上提出一个 pull request。
标签: jquery dropzone.js