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
相关产品推荐
相关产品推荐

