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

如何按文本内容对元素按字母排序并关联后续hidden div?

解决方案:将按钮与对应隐藏div作为整体排序

核心思路是把每个btn_expand按钮和它对应的隐藏div视为一个整体,排序时移动这个整体,而不是单独移动按钮。以下是具体实现:

假设你的菜单结构如下

<div class="menu-container">
  <button class="btn_expand">Banana</button>
  <div class="hidden">Banana details...</div>
  
  <button class="btn_expand">Apple</button>
  <div class="hidden">Apple details...</div>
  
  <button class="btn_expand">Cherry</button>
  <!-- 这个按钮没有对应的隐藏div -->
</div>

修改后的排序脚本

// 1. 获取菜单容器
const $menuContainer = $('.menu-container');

// 2. 收集所有「按钮+隐藏div」的组合
const sortableItems = $('.btn_expand').map(function() {
  const $currentBtn = $(this);
  // 检查当前按钮的下一个元素是否是带hidden类的div
  const $targetDiv = $currentBtn.next('div.hidden');
  // 存在则返回按钮+div的组合,不存在则只返回按钮
  return $targetDiv.length ? $currentBtn.add($targetDiv) : $currentBtn;
}).get();

// 3. 按按钮文本的字母顺序排序
sortableItems.sort((itemA, itemB) => {
  // 从每个组合中取出按钮的文本,统一转小写避免大小写影响排序
  const textA = $(itemA).filter('.btn_expand').text().trim().toLowerCase();
  const textB = $(itemB).filter('.btn_expand').text().trim().toLowerCase();
  // 用localeCompare处理多语言排序,比直接字符串比较更靠谱
  return textA.localeCompare(textB);
});

// 4. 重新渲染排序后的内容
$menuContainer.empty().append(sortableItems);

为什么这样能解决问题?

  • 不再单独排序按钮,而是把按钮和它绑定的隐藏div打包成一个单元,排序时整个单元一起移动
  • 排序后按钮和隐藏div的相邻关系完全保留,你原来的点击切换逻辑($(this).next('div.hidden').toggleClass('hidden'))不需要做任何修改,依然可以正常工作

额外提示

如果你的隐藏div和按钮之间可能插入了其他元素(不是直接相邻),可以把next('div.hidden')改成nextUntil(':not(.hidden)').addBack()或者根据实际结构调整选择器,但按你描述的「点击btn_expand切换下一个div的显示」,说明两者是直接相邻的,上面的代码完全适用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 00:15:36