【问题标题】:Use JavaScript to validate a field in Shiny App使用 JavaScript 验证 Shiny App 中的字段
【发布时间】:2016-02-12 02:16:57
【问题描述】:

我想验证一个关于使用 JavaScript 的表单。我知道我可以 通过像这样提供onclick 参数,将onclick 方法添加到actionButton:

textInput('timeField', "Time",'12:00')
actionButton('okButton', 
        'OK',
         onclick="function(){ if(!(/^([01][0-9]|2[0-3]):([0-6][0-9])$/
                                 .test($('#timeField').val()))){
                                       alert('download time must be in 24 hour (HH:MM)
                                              fomrat.'); 
                                  return false; } }"))

但是,JavaScript 函数中的引号字符会被转换为 &quot&#39,这会导致语法错误。我尝试将字符串包装在HTML() 中,但这似乎并没有改变这种行为。

有什么方法可以在onclick 参数中包含一个原始字符串,而不是让它被 Shiny 转换? (或者也许是在 Shiny App 的客户端验证表单的更好方法?)

【问题讨论】:

    标签: shiny shinyjs


    【解决方案1】:

    我会使用shinyjs 在 JavaScript 中进行表单验证。我稍微更改了您的 JS 函数,因为我认为那里的验证代码不起作用。示例:

    library(shiny)
    library(shinyjs)
    
    jscode <- HTML("
    shinyjs.validate = function() {
      var regex = /([01]\\d|2[0-3]):([0-5]\\d)/;
      if(!regex.test($('#timeField').val())) {
        alert('download time must be in 24 hour (HH:MM) format.');
      }
    }
    ")
    
    runApp(shinyApp(
      ui = fluidPage(
        useShinyjs(),
        extendShinyjs(text = jscode),
        textInput('timeField', "Time",'12:00'),
        actionButton('okButton', 'OK')
      ),
      server = function(input, output, session) {
        observeEvent(input$okButton, {
          js$validate()
        })
      }
    ))
    

    【讨论】:

    • 这是一个不错的解决方案,shinyjs 看起来像一个方便的包。不幸的是,闪亮本身并不支持使用 JS 代码,这是恕我直言的主要疏忽。第三方闪亮包(或任何其他框架)的风险是在闪亮最终更改其 API 时使第三方包保持最新。
    • Shiny 确实支持与 JS 通信,这就是我能够制作 shinyjs 包的方式。这不是超级琐碎而且有点冗长,所以我决定制作一个包来使这些东西更容易。总的来说,我同意你的看法,但在这种特殊情况下,我非常怀疑 Shiny 会彻底改变 JS 通信的工作方式,并且可能不会破坏 Shinyjs。如果他们这样做了——我相信我会在重大变化发生之前知道这件事,因为我有时会与闪亮的开发团队交谈,我相信他们会在巨大的重大变化之前让闪亮的包所有者知道。所以在这种情况下,它应该是安全的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 2012-02-20
    • 2020-01-16
    • 2018-11-27
    • 1970-01-01
    相关资源
    最近更新 更多