You need to enable JavaScript to run this app. jQuery循环中如何逐个获取对应输入框的值,当前仅能取到首个元素数值
优惠活动
大模型
产品
解决方案
定价
更多

jQuery循环中如何逐个获取对应输入框的值,当前仅能取到首个元素数值

问题出现的核心原因
  • 选择器作用域完全错误:在遍历.grid-container的循环体里,获取输入框值的代码使用了全局选择器$('.sec').find("input[name='mylist']"),这行代码会从整个页面的DOM树中查找匹配元素,不会绑定当前循环到的商品容器范围。按照jQuery的选择规则,当存在多个匹配项时,只会返回DOM流中第一个匹配元素的内部值,因此无论循环走到第几个商品条目,这行代码拿到的永远是第一个输入框的值。
  • 现有取价代码存在不严谨隐患:你当前使用的取价语句$(this).parents('span').find('label:eq(1)')逻辑方向存在偏差——$(this)指代当前遍历的.grid-container,parents()方法是向上查找父级元素,但按照你给出的HTML结构,span是.grid-container的子元素而非父级,这行代码目前能取到值是jQuery的全局匹配逻辑兜底,本身并不符合“获取当前商品对应价格”的预期,后续很容易因为DOM结构调整出现取值错乱。
  • 模板循环生成的元素存在属性违规:循环模板里给价格label、数量input都写了固定的id(prprice、prnumber),按照HTML规范,同一个页面的id必须全局唯一,重复id会导致浏览器默认只识别第一个出现的同id元素,是后续取值出现偏差的常见诱因。
具体修正方案

所有取值逻辑需要以当前循环到的.grid-container为根节点,向下查找对应的子元素,杜绝全局选择器的误用:

  • 取当前商品价格时,从当前.grid-container内部向下查找子级span下的第二个label:
    price = parseFloat($(this).find('span label:eq(1)').text().trim()) || 0;
    其中trim()用于清除模板渲染带来的多余空格,||0用于避免文本为空时转换结果为NaN的异常。
  • 取当前商品对应输入框的数值时,同样从当前.grid-container内部查找即可,可直接利用input自带的prnumberclass简化选择器:
    number = parseFloat($(this).find('input.prnumber').val()) || 0;
  • 配套优化:删除模板里重复的id="prprice"、id="prnumber"属性,只保留class作为选择依据,从根源上避免多id冲突。

修正后的完整可用代码示例:

$(document).ready(function() 
 {
    $("#tabSum").click(function(){
        let totalAmount = 0;

        $(".grid-container").each(function() {
            // 取当前商品单价
            const unitPrice = parseFloat($(this).find('span label:eq(1)').text().trim()) || 0;
            // 取当前商品的购买数量
            const buyNumber = parseFloat($(this).find('input.prnumber').val()) || 0;
            // 累加当前商品小计到总金额
            totalAmount += unitPrice * buyNumber;
        });

        // 按需添加总金额展示逻辑,比如更新到页面的总价节点
        console.log("计算完成的总金额:", totalAmount);
    });
 });

修正后每一轮循环的选择器都会被限制在当前商品容器的DOM范围内,不会跨节点取其他商品的值,即可逐个获取每个商品对应的输入框数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 08:15:07