【问题标题】:Dynamically loading multiple FilePond instances动态加载多个 FilePond 实例
【发布时间】:2022-04-18 16:39:43
【问题描述】:

我有一个页面,其中多个输入文件字段被动态添加到 DOM,并且每个都应该转换为 FilePond。

这是一个 Codepen 来模拟我的问题:https://codepen.io/veur/pen/pooZWoo

  • 点击“Load FilePond 1”并上传文件:触发FilePond:addfile事件
  • 单击“Load FilePond 2”:FilePond:addfile 事件再次为第一个 FilePond 触发

创建第二个文件元素时,我只希望将该元素转换为 FilePond。是否有 FilePond 方法可以仅加载未转换的文件输入?

【问题讨论】:

  • 您可以使用 jquery 在第二个文件池单击时隐藏第一个文件池
  • 这不是一个选项,因为我们需要同时激活多个 FilePonds。
  • 隐藏不会删除文件池,它只会将样式设置为无显示。
  • 我明白,但我们需要它们都同时可见和活跃。

标签: jquery filepond


【解决方案1】:

好的,我猜这就是你要找的。​​p>

您使用类名来创建文件池,因为您使用相同的类进行文件上传,这会产生问题。

当您希望两个元素彼此独立工作时,请始终使用 ID。

我为文件上传和将其传递给 loadFilePond 函数提供了一个唯一 ID。

希望对你有所帮助。

密码笔

https://codepen.io/hasnentrebdingcodes/pen/mddjXKo

$(function(){
    // First register any plugins
    $.fn.filepond.registerPlugin(
        FilePondPluginImagePreview
    );

    // Create FilePond element
    $(document).on('click', '.fp1', function(e) {
      $('.pond1').html(`<input type="file" id="fp-1"
      class="filepond"
      name="filepondone" 
      multiple 
      data-allow-image-edit="false"
      data-max-file-size="3MB"
      data-max-files="3">`);

      loadFilePond('fp-1');
    });

    // Create second FilePond element
    $(document).on('click', '.fp2', function(e) {
      $('.pond2').html(`<input type="file" id="fp-2"
      class="filepond"
      name="filepondtwo" 
      multiple 
      data-allow-image-edit="false"
      data-max-file-size="3MB"
      data-max-files="3">`);

      loadFilePond('fp-2');
    });
});

// Turn input element into a pond
function loadFilePond(clickedFP) {
    $('#'+clickedFP).filepond({
        allowMultiple: true,
          server:{
              process: {
                  url: '/api'
              }
          }
    });

    // Listen for addfile event
    $('#'+clickedFP).on('FilePond:addfile', function(e) {
        console.log('file added event', e);
    });
}
<a href="#" class="fp1">Load FilePond 1</a>
<div class="pond1"></div>

<a href="#" class="fp2">Load FilePond 2</a>
<div class="pond2"></div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js"></script>
<link href="https://unpkg.com/filepond/dist/filepond.css" rel="stylesheet">
<link href="https://unpkg.com/filepond-plugin-image-preview/dist/filepond-plugin-image-preview.css" rel="stylesheet">



<!-- include FilePond library -->
<script src="https://unpkg.com/filepond/dist/filepond.min.js"></script>

<!-- include FilePond plugins -->
<script src="https://unpkg.com/filepond-plugin-image-preview/dist/filepond-plugin-image-preview.min.js"></script>

<!-- include FilePond jQuery adapter -->
<script src="https://unpkg.com/jquery-filepond/filepond.jquery.js"></script>

【讨论】:

  • 为了保持动态,我通过创建 each() 循环来修复它。你可以在原 Codepen 中找到该函数:codepen.io/veur/pen/pooZWoo(在底部)
【解决方案2】:

我在纯 JavaScript 中创建了一个动态文件池实例,任何人都可以在我的一个 PHP 项目中尝试。

// Default Html input for Filepond 
<input id="pond1" type="file" class="filepond d-none imageOptions" name="image_options[]" data-allow-reorder="true" data-max-file-size="2MB" data-max-files="4" accept="image/png, image/jpeg, image/gif" />
             
//wrapper where the new input field will appear
var wrapper = $('.multipleOptions');
        
// Once add button is clicked create new filepond image upload option
$(addButton).click(function() {
    optionCount++;
    var fieldHTML =`<input id="pond${optionCount}" type="file" class="filepond imageOptions" name="image_options[]" data-allow-reorder="true" data-max-file-size="2MB" data-max-files="4"/>`;
    $(wrapper).append(fieldHTML);
        
    let pondId = "pond" + optionCount;
    loadFilepond(pondId);
});
        
// Call first instance of filepond
loadFilepond('pond1');
        
//create and load multiple filepond instance dynamically on addButton click
function loadFilepond( filePondId ) {
    console.log('input#' + filePondId);
    let inputElement = document.querySelector('input#' + filePondId);
    FilePond.create(inputElement);
    FilePond.setOptions({
        allowMultiple: true,
        server: {
            url :  "/uploads/tmp",
            headers: {
                'X-CSRF-TOKEN' : '{{ csrf_token() }}'
            }
        }
    })
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 2018-07-08
    • 2016-02-15
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多