【发布时间】:2016-04-02 09:11:00
【问题描述】:
我有一组动态生成的复选框,其中每个复选框都有一个 data-id 属性,对应于数据库整数 id。当我用要编辑的对象填充我的 html 表单时,有一个整数列表表示应该选中哪些复选框。复选框被包裹在 div 中,类为 checkbox-wrapper。
所以 html 看起来像这样:
<div class="checkbox-wrapper">
<input type="checkbox" id="checkbox1" data-id="1">
<label for="checkbox1">Checkbox 1</label>
</div>
<div class="checkbox-wrapper">
<input type="checkbox" id="checkbox2" data-id="2">
<label for="checkbox2">Checkbox 2</label>
</div>
<div class="checkbox-wrapper">
<input type="checkbox" id="checkbox3" data-id="99">
<label for="checkbox3">Checkbox 99</label>
</div>
请注意,id 在自动递增索引号上运行,而 data-id 可能具有不同的 id 值。我想通过 data-id 选择它们。
现在,使用 JQuery,我知道我可以像这样选择相关的复选框:
$(".checkbox-wrapper>input[data-id='99']");
$(".checkbox-wrapper>input[data-id='1']");
这适用于我的控制台,在 chrome 中,它返回相关的 DOM 元素。同样,下面的这将复选框设置为选中:
$(".checkbox-wrapper>input[data-id='99']").prop("checked", "checked");
$(".checkbox-wrapper>input[data-id='1']").prop("checked", "checked");
但是,如果我在我的 javascript 代码中(不是直接在控制台中)遍历整数列表,并根据 id 值记录返回的元素,我会得到一些奇怪的结果:
var ids = [1,2]
$.each(ids, function(index, myID){
console.log($(".checkbox-wrapper>input[data-id='"+myID+"']"));
$(".checkbox-wrapper>input[data-id='"+myID+"']").prop("checked", "checked");
});
首先,没有选中任何复选框。其次,我的控制台打印出奇怪的结果:
n.fn.init[0]
context: document
length: 0
prevObject: n.fn.init[1]
selector: ".checkbox-wrapper>input[data-id='1']"
__proto__: n[0]
n.fn.init[0]
context: document
length: 0
prevObject: n.fn.init[1]
selector: ".checkbox-wrapper>input[data-id='2']"
__proto__: n[0]
打印出来的选择器字符串看起来很完美。当直接写入 chrome 控制台时,完全相同的选择器返回 DOM 元素。然后他们返回这样的对象:
[<input type="checkbox" id="checkbox1" data-id="1">]
什么是 n.fn.init[0],为什么返回它?为什么我的两个看似相同的 JQuery 函数返回不同的东西?
【问题讨论】:
-
您在控制台中看到的“奇怪”结果是 jQuery 对象本身。您还可以看到
length属性为0,这意味着从您提供的选择器中找不到该元素,因此使用prop()无效。正如您在this example 中看到的那样,您的代码正如您所描述的那样有效。这意味着您需要检查控制台代码中其他地方的错误。问题可能是您没有正确包含 jQuery 库,或者您在 DOM 准备好之前运行代码。 -
很可能是最后一个。我的复选框是根据动态数据创建的。生成checkbox-html,并通过一个方法添加到文档中,每次更改日期选择器时都会调用该方法,即在加载对象以填充表单时调用该方法。换句话说,就在检查要检查的复选框之前。它是通过触发
changeDate-event 来完成的,我认为它不会停止我的填充方法的执行,直到它完成创建复选框 DOM 元素。 @RoryMcCrossan,您的评论实际上是对我问题的完整回答。你应该把它写下来作为答案。 -
鉴于,它并没有解决我的问题,但它完美地回答了这个问题,让我有机会继续前进,并调查下一步。不过,我还有任何其他问题更适合提出新问题。
-
.prop("checked", "checked")应该是.prop("checked", true) -
(这就是我将其作为评论而不是答案提交的原因。)您是否在页面完全加载后运行代码?如果没有,则不会加载 DOM,也不会匹配任何选择器。