gpt4 book ai didi

javascript - 在 Chrome 中重新加载动画 GIF 时出现问题

转载 作者:行者123 更新时间:2023-11-29 10:27:30 24 4
gpt4 key购买 nike

我有一个可以重新加载动画 gif 的应用程序。它在 Safari 中始终有效,但在 Chrome 中时断时续。我相信问题类似于提到的问题 here .

我对 Javascript 的了解微乎其微。然而,读书this ,我想出了这个例子,它仍然不起作用。使用 Chrome,如果您再次点击足够多的次数,您会发现有时图像重新加载失败。

library(shiny)
library(shinyjs)

jsCode <- '
shinyjs.reset_anim = function() {
var div_elem = document.getElementById("anim_plot");
var img_elem = div_elem.getElementsByTagName("img")[0];
var src_value = img_elem.getAttribute("src");
img_elem.setAttribute("src", "");
img_elem.setAttribute("src", src_value);
}
'


# Define UI ----
ui <- fluidPage(useShinyjs(),
extendShinyjs(text = jsCode),

plotOutput("anim_plot",
width = "900px",
height = "200px"),

fluidRow(
column(3,
actionButton("do_again", "Again")
)
)
)

# Define server logic ----
server <- function(input, output) {
observeEvent(input$do_again, {
js$reset_anim()
output$anim_plot <- renderImage({
list(src = "www/tmp/ani.gif",
contentType = 'image/gif',
width = 900,
alt = "Text"
)
}, deleteFile = FALSE)
})
}

shinyApp(ui = ui, server = server)

您可以找到 gif 动画 here .

最佳答案

我避免将 renderImage 用于此类事情。在过去,我自己在这个函数上苦苦挣扎了一段时间(它非常适合绘图,但似乎不适用于真正的 png、jpeg、gif 等)所以这里有一个使用 html img() 标签作为 renderUI 输出对象的工作替代方案。似乎您的 javascript 工作正常。此外,您可以只使用在线图片,我发现它比本地存储的效果更好

library(shiny)
library(shinyjs)

jsCode <- '
shinyjs.reset_anim = function() {
var div_elem = document.getElementById("anim_plot");
var img_elem = div_elem.getElementsByTagName("img")[0];
var src_value = img_elem.getAttribute("src");
img_elem.setAttribute("src", "");
img_elem.setAttribute("src", src_value);
}
'


# Define UI ----
ui <- fluidPage(useShinyjs(),
extendShinyjs(text = jsCode),
uiOutput('anim_plot'),
fluidRow(
column(3,
actionButton("do_again", "Again")
)
)
)

# Define server logic ----
server <- function(input, output) {
output$anim_plot <- renderUI({
img(src='https://uc290691998b0891615b1f3e9397.previews.dropboxusercontent.com/p/orig/AAae6QYO7VLEEUVYdUuL985gwFGGVQ_RJ0mjLtfJt0bk3UO1ThezW4YO7R5LUzN9_m6moBjubhfX2AAnYmEkwDEjnwIw1gLOWUrOw4q_pKYYtXW-JCgghu4NuCgPKCm3RXxt3rNULvlUg-cP_Oj2vnItglJchP6a6a_lyApxTdZHwPk4Yv6jWxiYANVdFAVKxiTeHWVC5J3PYDeW8yOnaj4VGDj92eJCIXYtjpmznffo0tPUdUovNJMMW5nzsgT0L38w_5h39bcBxIwoCBmZ95iC8SRd9BGHxJMGCM4HUVh_Ly0VW3lwBxUx3O__VD5Ind-lahJwVkZjmet-HzP6XnUB/p.gif?size_mode=5', align = "right")
})

observeEvent(input$do_again, {
js$reset_anim()

})
}

shinyApp(ui = ui, server = server)

更新:
在 www 文件夹中带有服务器文件、ui 文件和 5 个 gif 的应用程序:我刚刚从 giphy 下载了 5 个随机 gif 图片, 并使一个不循环 ezgif.com ,将它们存储为 gif1.gif、gif2.gif 等。

@OP:请记住,您的 javascript 以 1 个特定的 gif 对象为目标。如果你想重新加载另一个 gif,你将不得不重写你的 javascript 以获取一个输入参数,我猜这将是你希望重新启动的 anim_plot 的名称。我不是 JavaScript 专家,所以我不会尝试在此处添加它,但如果您这样做,请随时将其添加到此处的信息中

附注1:不要在你的 src 参数中加入 'www/'。 Shiny 会自动查看 www 文件夹。 .

p.s 2:请记住,有些东西在 RStudio 的内部界面中不起作用,并通过单击右侧小箭头菜单下的“运行外部”将其设置为在外部运行 Shiny 的应用程序运行应用程序”播放按钮。

# File of the server.
server <- function(input, output) {

lapply(1:5, function(image_id) {
output[[paste('anim_plot', image_id, sep = '')]] <- renderUI({
img(src=paste('gif', image_id, '.gif', sep = ''), align = "right")

})
})

observeEvent(input$do_again, {
js$reset_anim()

})
}


# File of UI ----
library(shiny)
library(shinyjs)

jsCode <- '
shinyjs.reset_anim = function(anim_plot2) {
var div_elem = document.getElementById("anim_plot2");
var img_elem = div_elem.getElementsByTagName("img")[0];
var src_value = img_elem.getAttribute("src");
img_elem.setAttribute("src", "");
img_elem.setAttribute("src", src_value);
}
'


ui <- fluidPage(useShinyjs(),
extendShinyjs(text = jsCode),
uiOutput('anim_plot1'),
uiOutput('anim_plot2'),
uiOutput('anim_plot3'),
uiOutput('anim_plot4'),
uiOutput('anim_plot5'),

fluidRow(
column(3,
actionButton("do_again", "Again")
)
)
)

screenshot

关于javascript - 在 Chrome 中重新加载动画 GIF 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55213748/

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