缓存复选框集合后无法通过ID选中元素?jQuery1.3.2问题排查
咱们一步步拆解你的问题,复选框未选中主要有三个核心原因:
1. 选择器方法用错了!
你缓存的this.$checkboxBtns已经是所有复选框元素的jQuery集合,但你用了find('#w' + value)去查找元素——这完全不对!find()是用来查找当前元素的后代节点,可你的复选框本身就是叶子节点,没有后代,所以永远找不到目标元素。
正确的做法是用filter(),它会在已缓存的复选框集合里筛选出符合ID选择器的元素:
// 错误写法 this.$checkboxBtns.find('#w' + value).attr('checked', true); // 正确写法 this.$checkboxBtns.filter('#w' + value).attr('checked', 'checked');
2. jQuery 1.3.2中checked属性的赋值方式不对
虽然你知道用attr而不是prop(因为1.3.2没有prop),但这里有个坑:HTML里的checked是布尔属性——只要这个属性存在,复选框就会被选中,它的有效值是checked或者空字符串,而不是布尔值true。
旧版jQuery把true传给attr时,会把属性值设置为字符串"true",这不符合HTML规范,浏览器不会识别成选中状态。所以必须改成赋值为'checked'。
3. 数据集与HTML元素不匹配
你的weekly数组是[0, 3],但HTML里的weekly复选框只有#w1和#w3——#w0根本不存在!这会导致循环到0时找不到元素,虽然不影响其他有效项,但也是一个需要注意的小问题(如果是业务错误的话,需要修正数据集)。
修复后的完整render方法
我还把for...of换成了jQuery的$.each,因为jQuery 1.3.2通常搭配的旧浏览器可能不支持ES6的for...of语法,兼容性更好:
render: function() { var that = this; // 处理Weekly复选框 $.each(that.weekly, function(index, value) { var $checkbox = that.$checkboxBtns.filter('#w' + value); if ($checkbox.length) { // 先确认找到元素再操作 $checkbox.attr('checked', 'checked'); } else { console.log('未找到Weekly复选框:', '#w' + value); } }); // 处理Monthly复选框 $.each(that.monthly, function(index, value) { var $checkbox = that.$checkboxBtns.filter('#m' + value); if ($checkbox.length) { $checkbox.attr('checked', 'checked'); } else { console.log('未找到Monthly复选框:', '#m' + value); } }); // 处理Quarterly复选框 $.each(that.quarterly, function(index, value) { var $checkbox = that.$checkboxBtns.filter('#q' + value); if ($checkbox.length) { $checkbox.attr('checked', 'checked'); console.log('已选中:', '#q' + value); } else { console.log('未找到Quarterly复选框:', '#q' + value); } }); }
验证方法
你可以在循环里打印$checkbox.length,如果输出1说明找到了目标元素,0就是没找到——这样就能快速确认是否选中了正确的元素。
内容的提问来源于stack exchange,提问作者Imnotapotato

