R Shiny DataTable如何防止包含超链接的列中的行选择/取消选择

Posted

技术标签:

【中文标题】R Shiny DataTable如何防止包含超链接的列中的行选择/取消选择【英文标题】:R Shiny DataTable How to prevent row selection/deselection in columns containing hyperlinks 【发布时间】:2018-12-11 05:09:24 【问题描述】:

我正在处理一个带有可点击元素的数据表。行的一列包含一个超链接。单击超链接时,我不希望触发或管理行单击事件(选择/取消选择)。

我对 R Shiny 的尝试:

function preventDefault(e) 
   e.preventDefault();
   e.stopPropagation();

   return false;

DataTable 中包含链接的元素:

<a href="#" onclick="preventDefault(event)";>

但是什么也没发生。

完整源代码:

library(shiny)
library(DT)
library(dplyr)

ui <- fluidPage(

   # Application title
  DT::dataTableOutput("DTExample")


)

server <- function(input, output) 
  dat <- head(iris)

  dat <- dat %>% mutate(clickme = '<a href="#" 
                     onclick="event.preventDefault(); event.stopPropagation(); alert(event); return false;";
                     >CLICKME</a>')

  output$DTExample<- renderDataTable(
    datatable(dat, escape = FALSE, class = 'cell-border stripe')
  ) 


# Run the application 
shinyApp(ui = ui, server = server)

【问题讨论】:

好建议。已附上示例代码。 【参考方案1】:

问题的发生是因为“突出显示操作”绑定到“mousedown”,这发生在“click”事件之前。你无法阻止之前发生的事件,对吧?

一个简单的解决方案是使用onmousedown 而不是onclick

dat <- dat %>% mutate(clickme = '<a href="#" 
                    onmousedown="event.preventDefault(); event.stopPropagation(); alert(event); return false;";
                    >CLICKME</a>')

顺便说一句,您可以使用 chrome F12 来检查事件侦听器。您可以删除一些侦听器以查看差异并找到哪个侦听器用于“突出显示”

另外,我发现这是因为当我单击链接但未释放时,突出显示发生但单击未发生。然后我意识到这可能是关键并使用 Chrome 检查事件侦听器。希望你能理解调试的方式!

【讨论】:

太棒了,完美运行。只需删除alert(event); 即可打开链接,当然没有行选择,但没有警告消息 我发现onmousedown='event.stopPropagation();' 在这种情况下足以阻止事件冒泡。 是的,我只是做了最少的修改以使其工作,因为关键是 onmousedownonclick 之间的区别。

以上是关于R Shiny DataTable如何防止包含超链接的列中的行选择/取消选择的主要内容,如果未能解决你的问题,请参考以下文章

如何在Shiny R中丢弃DT :: datatable上的用户编辑

渲染 JavaScript 会破坏 R Shiny DT (DataTable) 中的页面导航和反应功能

r 在Shiny中设置DT :: datatable中的水平滚动

R Shiny DataTable 选定的行颜色

指定datatable pdf output r shiny的文件名和标头

R Shiny 中 DT::datatable() 中冻结标头问题的解决方法