您的解决方案有效。但是,也可以使用 jQuery UI 的功能来控制它。您还可以使用jqui_sortable 函数的options 参数来控制滚动以及jQuery Widgets 的更多交互,记录在here。列出了可排序的选项here,从中我们可以找到scroll、scrollSensitivity、scrollSpeed,它们是options和sort,控制排序的事件。
在javaScript中做你想做的事情是这样的:
$(".sortable").sortable({
scroll: true,
scrollSensitivity: 40,
scrollSpeed: 1,[
sort: function(event, ui) {
var currentScrollTop = $(window).scrollTop(),
topHelper = ui.position.top,
delta = topHelper - currentScrollTop;
setTimeout(function() {
$(window).scrollTop(currentScrollTop + delta);
}, 5);
}
});
我们可以像这样在 shinyjqui 中定义这些选项:
jqui_sortable("#lst", operation = "enable", options = list(
scroll = TRUE,
scrollSensitivity = 40,
scrollSpeed = 1,
sort = JS('function(event, ui) {
var currentScrollTop = $(window).scrollTop(),
topHelper = ui.position.top,
delta = topHelper - currentScrollTop;
setTimeout(function() {
$(window).scrollTop(currentScrollTop + delta);
}, 5);
}'))
)
请注意,我只是将滚动、滚动速度和滚动敏感度设置为列表中的项目。排序需要一个函数,在上面的函数中可以看到,在documentation中也可以看到:
排序(事件,用户界面)
这给了我们卷轴:
这种方法的好处是您可以启用或禁用滚动、控制滚动速度、滚动灵敏度(滚动开始时应离边缘多近)。例如,使用您的解决方案,我可以通过设置 scroll = FALSE 来禁用滚动并且它不会滚动。不仅仅是滚动,还有更多交互,这就是 jQuery UI 如此出色的原因!我推荐这种方法来充分利用 jQuery UI。
完整应用:
library(shiny)
library(shinyjqui)
ui <- dashboardPage(
header = dashboardHeader(),
sidebar = dashboardSidebar(),
body = dashboardBody(
actionButton("add", "add"),
div(id = "lst"),
))
server <- function(input, output, session) {
observeEvent(input$add, {
jqui_sortable("#lst", operation = "destroy")
insertUI(
selector = "#lst",
where = "beforeEnd",
ui = fluidRow(box(title = paste0("test", input$add), h1("test")))
)
jqui_sortable("#lst", operation = "enable", options = list(
scroll = TRUE,
scrollSensitivity = 40,
scrollSpeed = 1,
sort = JS('function(event, ui) {
var currentScrollTop = $(window).scrollTop(),
topHelper = ui.position.top,
delta = topHelper - currentScrollTop;
setTimeout(function() {
$(window).scrollTop(currentScrollTop + delta);
}, 5);
}'))
)
})
}
shinyApp(ui, server)