You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R Shiny DT Datatable中为JavaScript添加条件判断的问题

解决DT Datatable中条件判断不生效的问题

问题原因

你使用$cell.data.length判断单元格内容长度是完全错误的:

  • $cell.data是jQuery的数据操作方法(本质是一个函数),它的length属性代表该函数的参数个数(固定为1),和单元格的实际内容长度没有任何关系。
  • 这就导致你设置>1时,条件判断逻辑错误触发了所有单元格效果;设置>2时,因为1>2永远为假,所以所有单元格都不生效。

修正代码

要判断单元格内容长度,需要获取单元格的实际文本内容。结合你已经把内容包裹在.content容器里的逻辑,直接用$content.text().length即可(加trim()可以排除前后空白的干扰)。修正后的完整代码如下:

library(DT)
library(shinipsum)

text_df <- data.frame(
  numbers = 1:3,
  letters = LETTERS[1:3],
  text    = c(
    "Lorem", 
    substr(shinipsum::lorem, 1, 100), 
    substr(shinipsum::lorem, 1, 5000)
  )
)

js <- "
function(cell) {
  var $cell = $(cell);
  $cell.contents().wrapAll('<div class=\"content\"></div>');
  var $content = $cell.find('.content');
  // 基于单元格实际文本长度判断,trim()去除前后空白避免误判
  if($content.text().trim().length > 10){
    $cell.append($('<button>Read more</button>'));
    var $btn = $cell.find('button');
    $content.css({
      height: '20px',
      overflow: 'hidden'
    });
    $cell.data('isLess', true);
    $btn.click(function () {
      var isLess = $cell.data('isLess');
      $content.css('height', isLess ? 'auto' : '20px');
      $(this).text(isLess ? 'Read less' : 'Read more');
      $cell.data('isLess', !isLess);
    });
  } 
}"
datatable(
  text_df,
  rownames = FALSE,
  options = list(
    "columnDefs" = list(
      list(
        "targets" = 2,
        "createdCell" = JS(js)
      )
    )
  )
)

额外优化点

  • 给$btn添加var声明,避免污染全局变量
  • 收起时的高度改回20px,和初始高度保持一致,逻辑更统一

内容的提问来源于stack exchange,提问作者RTS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 12:40:41