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

如何使JS函数对每个div生效?实现每个div最后可见单词替换为span

嗨,我来帮你解决这个问题~你的代码目前只处理第一个div,还会干扰其他div的原因是没有单独遍历每个div进行处理,而且全局替换HTML的方式会把所有匹配到的单词都换掉,自然就乱了。

咱们可以改成逐个处理每个div,这样每个元素都能独立计算自己的最后一个可见单词:

修正后的代码

$('div').each(function() {
  var $div = $(this);
  // 记录当前div的原始尺寸
  var originalSize = [$div.width(), $div.height()];
  // 把文本拆分成单词数组
  var words = $.trim($div.text()).split(/\s+/);
  var targetWord = '';

  // 循环尝试去掉最后一个单词,直到内容尺寸不超过原始尺寸
  while (words.length > 0) {
    // 创建克隆元素来测试当前单词组合的尺寸
    var $clone = $div.clone().text(words.join(' ')).insertAfter($div);
    // 把克隆元素的内容包成span,方便计算尺寸
    $clone.contents().wrap('<span />');
    var $span = $clone.find('span');
    
    if ($span.width() <= originalSize[0] && $span.height() <= originalSize[1]) {
      // 如果当前组合的尺寸符合,那刚才去掉的就是最后一个可见单词
      targetWord = words.pop();
      $clone.remove();
      break;
    } else {
      // 尺寸超了,继续去掉最后一个单词
      words.pop();
      $clone.remove();
    }
  }

  // 替换当前div里的目标单词为带样式的span
  if (targetWord) {
    var newHtml = $div.html().replace(new RegExp('\\b' + targetWord + '\\b'), '<span class="red">' + targetWord + '</span>');
    $div.html(newHtml);
  }
});

关键改进点

  • 使用each()遍历每个div,确保每个元素都被单独处理,不会互相干扰
  • 每个div都维护自己的单词数组和尺寸记录,避免全局变量污染
  • 用\b正则边界匹配单词,防止替换掉包含目标单词的其他文本(比如"cat"不会误替换"category"里的"cat")
  • 克隆元素测试尺寸后及时移除,避免页面冗余元素

这样每个div都会正确找到自己的最后一个可见单词,并且单独替换,不会影响其他div啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:35:12