【问题标题】:Dropzone.js - How to attach clickable (upload button) dynamicallyDropzone.js - 如何动态附加可点击(上传按钮)
【发布时间】: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'});

  });
});

这里有一个小提琴:

http://jsfiddle.net/tomas_eklund/761qr3r5/

【问题讨论】:

  • 您是否尝试过将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


【解决方案1】:

通过扫描 dropzone.js 源代码,我发现了一个未记录的 destroy() 方法。将它与可重用选项对象结合使用,我现在正在为每个加载的新订单销毁和重新创建 Dropzone。

所以在页面加载时我创建了这个 Dropzone(它不会上传任何东西,但会优雅地拒绝所有上传):

var dropzoneOptions = { clickable: false /* see Question ... */ };
var documentDropzone = new Dropzone(document.body, dropzoneOptions);

在我的“.view-opener”点击处理程序中,在加载所选订单的 ajax 调用之后,我添加了这段代码,该代码将销毁先前的 Dropzone 对象,增加选项对象并创建一个新的 Dropzone 实例:

documentDropzone.destroy();
dropzoneOptions.clickable = '#dropzone-click-target';
documentDropzone = new Dropzone(document.body, dropzoneOptions);

我还更新了 JS Fiddle:http://jsfiddle.net/tomas_eklund/761qr3r5/39/

【讨论】:

  • 这对我有帮助!谢谢!
  • @TomasEklund,如何将图像缩略图设置为可点击的,假设有两个可点击的 div 元素,缩略图出现在点击浏览文件的一个元素上?谢谢
  • @HouyNarun 恐怕我不明白这个问题。您最好在论坛上将您的查询作为一个新问题发布。包括一个小提琴,以便我们可以看到你在做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多