如何在jQuery中将for循环的i变量传入id选择器匹配对应元素?
你的代码存在三处错误导致无法正常运行:
- 选择器拼接逻辑错误:jQuery中
$(选择器, 上下文)的写法第二个参数是查询的上下文节点,不是用来拼接字符串的,要拼接ID需要直接把变量拼到选择器字符串里,正确写法为$("#cell" + i)或ES6模板字符串写法`#cell${i}`。 - 闭包陷阱:你用
var声明循环变量i,存在变量提升,所有事件回调函数触发时拿到的i都是循环结束后的最终值82,无法对应到每个输入框的正确ID。 - 冗余调用:
$(document).ready()不需要写在循环内部,全局调用一次即可,重复调用不会生效还会额外占用性能。另外你循环的起始值为0,但你的输入框ID从cell1开始,会查询不存在的cell0元素。
最优解决方案(无需循环)
直接使用jQuery属性前缀选择器匹配所有符合规则的输入框,同时用this指向当前触发事件的元素,完全不需要拼接ID:
$(document).ready(function () { // 匹配所有id以cell开头的input元素 $('input[id^="cell"]').change(function () { const num = Number($(this).val()) if (num < 1) $(this).val(1) if (num > 9) $(this).val(9) }) })
如果你需要坚持用循环实现
方案1:使用let声明循环变量(ES6+环境适用)
利用let的块级作用域特性,避免闭包问题:
$(document).ready(function () { // 按你的实际ID范围调整上下限,示例是cell1到cell9 for(let i = 1; i <= 9; i++) { $(`#cell${i}`).change(function () { const num = Number($(this).val()) if (num < 1) $(this).val(1) if (num > 9) $(this).val(9) }) } })
方案2:立即执行函数封装(兼容ES5及更早环境)
用立即执行函数把每次循环的i值锁在单独的作用域中:
$(document).ready(function () { for(var i = 1; i <= 9; i++) { (function(index) { $('#cell' + index).change(function () { const num = Number($(this).val()) if (num < 1) $(this).val(1) if (num > 9) $(this).val(9) }) })(i) } })
内容的提问来源于stack exchange,提问作者Rey
相关产品推荐
相关产品推荐

