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

使用JavaScript从li元素data-id获取ID时重复取首个ID的问题排查

JavaScript循环中重复获取第一个li的data-id问题

问题背景

你想要从带有rightDiv类的<ul>元素中提取会话编号,同时遍历每个<li>获取对应的data-id,但实际运行后发现所有subjectID都变成了第一个<li>的ID,没能正确获取每个li的对应值。

现有代码

HTML结构

<ul id="form_builder_sortable_sample" class="sortable rightDiv session4 ui-sortable">
  <li class="draggable" data-id="1" name="Counting" >Counting<button onclick="deleteElement(event)" class="delbtn">×</button></li>
  <li class="draggable" data-id="2" name="Priorities" >Priorities<button class="delbtn">×</button></li>
</ul>

JavaScript代码

var sessions = [];
$('.rightDiv').each(function(index) {
  var session = $.trim($(this).text().slice(0, -1)).split('×');
  var sessionData = [];
  for (var i = 0; i < session.length; i++) {
    var ids = $(this).find('li').data('id');
    var s = { subjectOrder: i, subjectID: ids };
    sessionData.push(s);
  }
  var ses = { sessionNo: index, sessionData: sessionData };
  sessions.push(ses);
});

结果对比

  • 实际得到的JSON:
{"sessionNo":"0","sessionData":[{"subjectOrder":"0","subjectID":"1"},{"subjectOrder":"1","subjectID":"1"}]}
  • 期望的正确JSON:
{"sessionNo":"0","sessionData":[{"subjectOrder":"0","subjectID":"1"},{"subjectOrder":"1","subjectID":"2"}]}

问题原因

核心问题出在这一行代码:

var ids = $(this).find('li').data('id');

当你调用$(this).find('li')时,返回的是当前<ul>下所有<li>元素的集合,而.data('id')方法只会返回集合中第一个元素的data-id值。所以不管循环多少次,你拿到的始终是第一个<li>的data-id=1,自然就出现了重复的结果。

另外还有个潜在隐患:你通过split('×')来获取<li>的数量,这种方式依赖文本内容里的×符号,一旦HTML结构或者文本有变化,这个数量就可能不准确,不如直接用<li>元素的数量来循环更可靠。

修复方案

有两种简单的修复方式,推荐第二种更直观健壮的写法:

方式1:修改循环中li的定位逻辑

在for循环里,通过.eq(i)定位到当前索引对应的<li>元素,再获取它的data-id:

var sessions = [];
$('.rightDiv').each(function(index) {
  var $lis = $(this).find('li'); // 先缓存所有li元素,避免重复查找
  var sessionData = [];
  for (var i = 0; i < $lis.length; i++) {
    var ids = $lis.eq(i).data('id'); // 精准定位到第i个li
    var s = { subjectOrder: i, subjectID: ids };
    sessionData.push(s);
  }
  var ses = { sessionNo: index, sessionData: sessionData };
  sessions.push(ses);
});

方式2:直接遍历li元素(更简洁可靠)

用.each()直接遍历每个<li>,同时获取索引和对应的data-id,逻辑更清晰,也不依赖文本符号:

var sessions = [];
$('.rightDiv').each(function(index) {
  var sessionData = [];
  $(this).find('li').each(function(i) {
    var s = { 
      subjectOrder: i, 
      subjectID: $(this).data('id') // 这里的this是当前遍历的li元素
    };
    sessionData.push(s);
  });
  var ses = { sessionNo: index, sessionData: sessionData };
  sessions.push(ses);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:57:46