Reputation: 320
I want to use jquery UI with shiny (not using shinyjqui library). It works perfect when I have a layer and tried to move it using jqueryUI, but when this layer is dynamically generated using insertUI, then, it doesn´t work.
Here is the code:
library(shiny)
ui <- fluidPage(theme = "style.css",
tags$script(src = "jquery-ui.js"),
tags$script(src = "script2.js"),
actionButton("add","Add layer"),
div(class="aux"),
div(id="works",style="width:300px;height:200px;background:red"))
server <- function(input, output, session) {
observeEvent(input$add,{
insertUI(
selector = ".aux",
where="afterEnd",
ui = div(id=paste0("new",input$add),style="width:300px;height:200px;background:blue")
)
})
}
shinyApp(ui, server)
And the js script
$( function() {
$("#works").draggable();
$("#new1").draggable();
});
Thanks!
Upvotes: 6
Views: 4027
Reputation: 84519
That's because #new1
does not exist at the start-up. You have to execute the javascript code after it have been created, with shinyjs::runjs
for example. And use immediate=TRUE
in insertUI
.
library(shiny)
library(shinyjs)
ui <- fluidPage(
useShinyjs(),
tags$head(
tags$script(src = "jquery-ui/jquery-ui.min.js"),
tags$script("$(function() {
$('#works').draggable();
})")
),
actionButton("add","Add layer"),
div(class="aux"),
div(id="works",style="width:300px;height:200px;background:red"))
server <- function(input, output, session) {
observeEvent(input$add,{
insertUI(
selector = ".aux",
where="afterEnd",
ui = div(id=paste0("new",input$add), style="width:300px;height:200px;background:blue"),
immediate = TRUE
)
runjs("$('#new1').draggable();")
})
}
shinyApp(ui, server)
Upvotes: 8