Dropzone打开文件选择器两次

时间:2014-11-26 15:43:16

标签: dropzone.js

我已经使用可点击元素设置了dropzone。单击该按钮会导致dropzone打开文件选择器两次,而不是仅打开一次,第二个文件在第一个文件被选中后立即打开。

初始化代码是:

Dropzone.autoDiscover = false;

$(document).ready(function(){

// Remove the template from the document.
var previewNode = document.querySelector("#template");
previewNode.id = "";
var previewTemplate = previewNode.parentNode.innerHTML;
previewNode.parentNode.removeChild(previewNode);

$("div#photo").dropzone({
    url: "/blackhole/",
    thumbnailWidth: 240,
    thumbnailHeight: 240,
    parallelUploads: 1,
    maxFiles:1,
    maxFilesize: 5,
    uploadMultiple: false,
    previewTemplate: previewTemplate,
    autoProcessQueue: true,
    previewsContainer: "#photoPreview", 
    clickable: ".fileinput-button",
    init: function() {
        this.on("maxfilesexceeded", function(file) {
            this.removeAllFiles();
            this.addFile(file);
        });
    }   
});

页面元素是:

      <div class="table table-striped" class="files">

        <div id="photo">
          <div id="actions" class="row">
            <div class="col-lg-7">
              <button type="button" class="btn btn-success fileinput-button">
                <i class="glyphicon glyphicon-plus"></i>
                <span>Choose file...</span>
              </button>
            </div>
          </div>
        </div>

        <div class="files dropzone-previews" id="photoPreview">
          <div id="template" class="file-row">
            <div>
              <span class="preview"><img data-dz-thumbnail /></span>
            </div>
            <div>
              <p class="name" data-dz-name></p>
              <strong class="error text-danger" data-dz-errormessage></strong>
            </div>
            <div>
              <p class="size" data-dz-size></p>
              <div class="progress progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0">
                <div class="progress-bar progress-bar-success" style="width:0%;" data-dz-uploadprogress></div>
              </div>
            </div>
            <div>
              <button data-dz-remove type="button" class="btn btn-warning cancel">
                <i class="glyphicon glyphicon-ban-circle"></i>
                <span>Cancel</span>
              </button>
            </div>
          </div>
        </div>
      </div>
    </div>

奇怪的是,即使我添加了代码来替换以后的任何现有文件(因此只能上传一个文件),第二个文件选择器对话框允许我添加第二个文件。

它的dropzone已初始化两次,但我检查它只是初始化一次,并且还添加了autoDiscover = false选项以便进行测量。

有人能发现我的错误吗?

4 个答案:

答案 0 :(得分:6)

问题似乎在于我们如何初始化dropzone:

$("div#photo").dropzone({
...
}

以非jquery的方式解决问题:

var myDropZone = new Dropzone("#photo",{
...
}

这是关于dropzone 3.11.1。

在github / dropzone上创建了一个问题: https://github.com/enyo/dropzone/issues/771

答案 1 :(得分:1)

在为此打开的issue中,maliayas说:

当您的clickable元素已经是一个 输入[类型=文件]。 Dropzone会再注入一个,现在有两个。

要么dropzone应该处理这种情况,要么文档应该处理 提及不要为可点击元素使用input [type = file]。

将我的dropzone元素更改为input[type=file]之外的其他内容对我来说就是一个问题。

答案 2 :(得分:1)

将 dropzone 附加到父级,而不是输入。

在 Chrome 中,如果您检查并查看 eventListeners。您将看到,一旦您将 dropzone 附加到您的输入中,您就有了一个额外的点击事件监听器。

假设您有一个包含子输入元素的文档的上传列表。

<li class="upload drag-and-drop">
    <input type="file"/>
</li>

代码:

$('input').dropzone();

将事件侦听器附加到已可点击的元素。所以你有 2 个事件监听器。一个来自浏览器。一个来自 dropzone。因此有 2 个对话框...

如果您将其附加到父项:

$('li.upload').dropzone();

您现在将拥有父级的侦听器。这允许在您拖放时冒泡行为击中正确的元素,而不会无意中影响输入。

答案 3 :(得分:0)

当我在浏览触发器具有相同类别的页面上存在多个dropzone时,会发生这种情况,似乎dropzone将事件附加到页面上的任何元素而不仅仅是在其自己的容器中