gpt4 book ai didi

javascript - 自动关闭日期范围输入 Shiny

转载 作者:行者123 更新时间:2023-11-30 20:39:55 25 4
gpt4 key购买 nike

我希望日期选择器在选择日期后自动关闭。当 daterangeinput 直接在 ui 中呈现但在服务器中创建时我知道该怎么做。

这是我的代码。

library('shiny')

js_string <- "$('#dates input').bsDatepicker({autoclose: true});"

shinyApp(
ui = fluidPage(
tags$head(tags$script(HTML('Shiny.addCustomMessageHandler("jsCode", function(message) { eval(message.value); });'))),
includeScript("code.js"),
fluidRow(
column(4,
uiOutput(outputId = 'dateui'),
verbatimTextOutput("datesOut")
)
)
),
server = function(input, output, session) {
output$dateui <- renderUI({
dateRangeInput("dates", label = h3("Date range"))
})
session$onFlushed(function() {
session$sendCustomMessage(type = 'jsCode', list(value = js_string))
})
output$datesOut <- renderPrint({ names(session) })
}
)

$('#dates input').bsDatepicker({autoclose: true}); 如果 daterange 是直接在 ui 中创建的,效果很好,如以下代码所示。此外,如果我想使用 $('#dates').attr('onkeydown', 'return false'); 禁用键盘输入,此代码也能正常工作。

library('shiny')

shinyApp(
ui = fluidPage(
includeScript("code.js"),
fluidRow(
column(4,
dateRangeInput("dates", label = h3("Date range")),
verbatimTextOutput("datesOut")
)
)
),
server = function(input, output, session) {
output$datesOut <- renderPrint({ input$dates })
}
)

用js代码

$(document).ready(function(){
$('#dates input').bsDatepicker({autoclose: true});
});

我的问题与 another question 有关我已经发布。

我也试过 $('#dates input').datepicker({autoclose: true}); 但它不起作用。我知道 $(document).ready(function() ... 无法工作,因为代码将在文档准备就绪后启动,因此在渲染日期范围之前启动。

编辑:

我也尝试过使用 shinyjs 但它也不起作用。

library('shiny')
library('shinyjs')

jsCode <- "shinyjs.changeDate = function(){
$('#dates input').bsDatepicker({autoclose: true});
$('#dates').attr('onkeydown', 'return false');
}"

shinyApp(
ui = fluidPage(
useShinyjs(),
extendShinyjs(text = jsCode),
fluidRow(
column(4,
uiOutput(outputId = 'dateui'),
verbatimTextOutput("datesOut")
)
)
),
server = function(input, output, session) {
output$dateui <- renderUI({
dateRangeInput("dates", label = h3("Date range"))
})
session$onFlushed(function() {
js$changeDate()
})
}
)

我被困在这里,非常感谢任何帮助。

干杯

Edit2: 添加我的 session 信息

R version 3.4.4 (2018-03-15)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS High Sierra 10.13.3

Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats graphics grDevices utils datasets methods base

other attached packages:
[1] shinyjs_1.0 shiny_1.0.5 V8_1.5

loaded via a namespace (and not attached):
[1] compiler_3.4.4 R6_2.2.2 htmltools_0.3.6 tools_3.4.4 curl_3.1
[6] yaml_2.1.18 Rcpp_0.12.16 digest_0.6.15 jsonlite_1.5 xtable_1.8-2
[11] httpuv_1.3.6.2 mime_0.5

最佳答案

这有点 hacky 但它可以使用 JQuery:

            tags$head(
tags$script(HTML("setInterval(
function checkContainer () {
if($('.datepicker-days').is(':visible')){ //if the container is visible on the page
$(function () {
$('td.day').click(function () {
$('.dropdown-menu').hide()
});
});
} else {
setTimeout(checkContainer, 50); //wait 50 ms, then try again
}
},
50 /* 10000 ms = 10 sec */
);"))
)

您需要做的就是将其添加到 uifluidpage 中的 tags$head 函数中。

如果最后的用户输入是选择日期,这会起作用。

如果您的 dateRangeInput 仅限于选择月份,那么您只需将 '.datepicker-days' 编辑为 '.datepicker-months ' 并将 '.td.day' 更改为 '.td.month'。如果您限制在一年内;将 days 更改为 years 并将 day 更改为 year

为什么它是 hacky 的原因是因为 JQuery 脚本每 50 毫秒重新部署一次,以检查 datepicker-days 类是否可见...但它有效。

关于javascript - 自动关闭日期范围输入 Shiny ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49389497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com