【问题标题】:FileList of file input in Shiny vs JSFiddleShiny vs JSFiddle中文件输入的文件列表
【发布时间】:2020-10-21 13:05:49
【问题描述】:

下面的应用程序包含一个文件输入和一个按钮,该按钮在单击时控制台记录文件输入的 FileList 对象。

在 Shiny 应用程序中,当我选择一个文件时,帮助文本会短暂更改为所选文件的名称,然后再恢复为“未选择文件”。单击“显示所选文件”按钮会返回一个空的 FileList。

这是应用程序:

library(shiny)

shinyApp(
  ui = fluidPage(
    tags$head(
      tags$script(HTML("
  
  $('#get').click(function() {
      console.log($('#file')[0].files)
  })

});"))
    ),
    HTML('
<input id="file" name="file" type="file">
<button id ="get">Show selected file</button>')
  ), 
  server = function(input, output, session) {}
)

在 JSFiddle 中,当我选择一个文件时,帮助文本会更改以显示所选文件的名称。点击按钮返回一个长度为 1 的 FileList。

Here is the JSFiddle

是什么导致了文件输入行为的这些差异?在 Shiny 中,我可以使用 onchange 事件来检查文件是否已上传(使用类似 $('#file').change(function() { $('#file')[0].files.length }); 的东西)但是 如果文件输入的值不是持久的,我如何在更改事件发生后执行检查? 选择文件后在控制台中键入 $('#file')[0].files.length 会为 Shiny 应用返回 01 用于 JSFiddle。

我查看了shiny.js 中文件输入的 Shiny 输入绑定,有一个 FileUploader 函数,但在其中找不到任何内容,或者在选择后重置文件输入值的 fileInputBinding。

【问题讨论】:

    标签: javascript jquery r shiny


    【解决方案1】:

    可能是这样的:

    js <- "
    $(document).ready(function(){
      var x = null;
      $('#file').on('change', function(){
        x = $('#file')[0].files.length;
      });
      $('#get').click(function() {
        console.log(x);
      })
    });
    "
    
    library(shiny)
    
    shinyApp(
      ui = fluidPage(
        tags$head(
          tags$script(HTML(js))
        ),
        HTML('
    <input id="file" name="file" type="file">
    <button id ="get">Show selected file</button>')
      ), 
      server = function(input, output, session) {}
    )
    

    【讨论】:

    • 感谢@Stéphane,我确实想过这样做,但我对使用全局变量持谨慎态度。如果没有其他人能够提出替代方案,我将接受您的回答。另外,您知道导致行为差异的原因是什么吗?
    • @user51462 Shiny 重置文件输入,以便用户能够上传另一个文件。但我不知道定义这种行为的 JS 代码在哪里。
    • 我认为该值已在 shiny.js 的第 5708 行重置。就是允许用户连续两次上传同一个文件。问题是我正在使用第三方插件,它需要访问 DOM 中文件输入的值,但如果它始终是 "",它就无法做到这一点。我能想到的一种解决方法需要我使用$.extend(plugin.prototype, [modified method]) 修改插件的特定方法。它有效,但对我来说似乎不太安全,所以我想听听你的意见。你曾经做过这样的事情吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    相关资源
    最近更新 更多