3

我有一个非常简单的 jquery 需要检查从 ajax 调用返回的布尔值,并设置一个复选框来检查它是否为真。

console.log("loc: " + r.location.defaultLocation);
if( r.location.defaultLocation == true ) {
    $('#loc-default').attr('checked',true);
}

这在打开模式表单的 onclick 函数中运行 - 如果返回的位置信息表明这是默认位置,则应选中该复选框。我们在一个页面上有 5 个这样的位置 - 即用户可以单击的 5 个位置。

我遇到的是,即使r.location.defaultLocation返回 false(根据 console.log 行),该复选框仍在检查中。我究竟做错了什么?

对于那些坚持真/假必须是字符串而不是布尔值的人:

这是结果console.info(typeof(r.location.defaultLocation));

在此处输入图像描述

这是 的结果console.dir(r),如果它有帮助的话。(group由于它是敏感信息而模糊。)

在此处输入图像描述

发现问题

显然,jquery 会记住#loc-default在第一个标记为已检查之后已检查。我在函数中添加了一个 else,现在它可以工作了:

if( r.location.defaultLocation == true ) {
    $('#loc-default').attr('checked',true);
}
else {
    $('#loc-default').attr('checked', false);
}
4

5 回答 5

3

我能看到发生这种情况的唯一方法是,如果 defaultLocation 实际上不是布尔值 false,而是字符串“false”,它的计算结果为 true。

于 2012-12-20T16:27:03.610 回答
2

确保r.location.defaultLocation是布尔值。

尝试if (!!r.location.defaultLocation) {}将值强制为布尔类型。

于 2012-12-20T16:26:11.450 回答
2

我认为r.location.defaultLocation字符串 "false"。因此,如果您使用console.log它,您将看到"false". 不过"false" == true是真的。

您可以使用 来检查变量的类型typeof

console.log(typeof r.location.defaultLocation); // Log the current type of r.location.defaultLocation
console.log(typeof false); // Display boolean
console.log(typeof "false"); // Display string
于 2012-12-20T16:27:39.417 回答
1

由于您的代码似乎是正确的,我会尝试处理 else 语句并强制不选中该复选框。

if( r.location.defaultLocation == true ) {
    $('#loc-default').attr('checked',true);
} else {
    $('#loc-default').attr('checked',false);
}
于 2012-12-20T16:28:04.217 回答
0

首先我会检查看看是r.location.defaultLocation什么

 console.info(typeof(r.location.defaultLocation));

然后我会从那里去,但使用上面的代码:

 if (!!r.location.defaultLocation && typeof(r.location.defaultLocation)==="string") {}
于 2012-12-20T16:29:09.867 回答