var canAssignMultiple="true";
var canWithdrawMultiple="true";
function onCheckUncheck()
{
if($(':checkbox[name^="checkedRecords"]:checked').length>0)
{
$("input[name='checkedRecords']:checked").each(function()
{
debugger;
var canAssign = $(this).attr("canAssign").toLowerCase();
var canWithdraw = $(this).attr("canWithdraw").toLowerCase();
canAssignMultiple= canAssignMultiple && canAssign;
canWithdrawMultiple= canWithdrawMultiple && canWithdraw;
if (canAssignMultiple == "false")
$("#assaignbutton").attr("disabled", "disabled");
else
$("#assaignbutton").removeAttr("disabled");
if (canWithdrawMultiple == "false")
$("#withdrawbutton").attr("disabled", "disabled");
else
$("#withdrawbutton").removeAttr("disabled");
});
}
else
{
$("#assaignbutton").attr("disabled", "disabled");
$("#withdrawbutton").attr("disabled", "disabled");
}
}
变量canAssignMultiple在第二次调用each()函数时变为true,尽管在第一次迭代中它的值已经变为false。它应该保持循环运行的值evrytime。如何做到这一点?
答案 0 :(得分:0)
boolean
(false,true)值与strings
不同(“false”,“true”)
试
var canAssignMultiple = true;
var canWithdrawMultiple = true;
function onCheckUncheck() {
if ($(':checkbox[name^="checkedRecords"]:checked').length > 0) {
$("input[name='checkedRecords']:checked").each(function() {
debugger;
var canAssign = $(this).attr("canAssign").toLowerCase() == "true"; // make this a boolean expression
var canWithdraw = $(this).attr("canWithdraw").toLowerCase() == "true"; // make this a boolean expression
canAssignMultiple = canAssignMultiple && canAssign;
canWithdrawMultiple = canWithdrawMultiple && canWithdraw;
if (canAssignMultiple === false) $("#assaignbutton").attr("disabled", "disabled"); // use false (instead of "false")
else $("#assaignbutton").removeAttr("disabled");
if (canWithdrawMultiple === false) $("#withdrawbutton").attr("disabled", "disabled"); // use false (instead of "false")
else $("#withdrawbutton").removeAttr("disabled");
});
}
else {
$("#assaignbutton").attr("disabled", "disabled");
$("#withdrawbutton").attr("disabled", "disabled");
}
}
留下评论所做的更改
答案 1 :(得分:0)
正如其他人所说,字符串"true"
和"false"
的功能与布尔值true
和false
的功能不同。如果您尝试在if
语句中使用字符串或使用&&
等逻辑运算符,则字符串将转换为布尔值;并且所有非空字符串都转换为true
(即它们是“真实的”)。这意味着字符串"false"
将与您期望的相反,例如在("false" && x)
或if ("false") {...}
。
修复代码的一种方法是更改此行
canAssignMultiple = canAssignMultiple && canAssign;
以明确且正确的方式将canAssign
转换为布尔值:
canAssignMultiple = canAssignMultiple && (canAssign == "true");
然后&&
运算符将正常工作,canAssignMultiple
将保持实际的布尔值。
并且(正如@mdmullinax所说,但我会采用不同的方式)一旦canAssignMultiple实际上是一个布尔值,你可以改变你的if
语句来对待它们:
if (canAssignMultiple == "false")
应该成为
if (!canAssignMultiple)
与相应的withdraw
相似。
答案 2 :(得分:0)
你的HTML看起来像这样吗?
<input canAssign="false" ...>
<input canAssign="true" ...>
如果是这样,并且您无法更改HTML,我建议您更改:
canAssign = $(this).attr("canAssign").toLowerCase()
到此(从那时开始与布尔合作):
canAssign = $(this).attr("canAssign") == "true"
和此:
if(canAssignMultiple == "false")
到此(因为它现在是一个真正的布尔值):
if(canAssignMultiple)
如果您可以更改HTML,我建议您按照HTML5标准进行操作。首先,所有组成的属性都应该加前缀data-
。您也可以将camelCase更改为连字符。 JQuery在加载数据属性时,如果可能,将从字符串perform the conversion开始:
<input data-can-assign="false" ...>
<input data-can-assign="true" ...>
然后jQuery将为您提供此调用所需的布尔值:
canAssign = $(this).data("canAssign")
当然,同样的修复应该应用于所有其他字符串伪布尔值(对布尔运算符也不太适用)。
原因是:"false"
并非false
。 "false" && x
将评估为x
(而不是"false"
,如您所愿。另一方面,false && x
将评估为false
。