-1
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");
    }
}

当 each() 函数被第二次调用时,变量 canAssignMultiple 变为 true,尽管它的值在第一次迭代中变为 false。它应该在每次循环运行时保持其值。如何做到这一点?

4

3 回答 3

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,在加载你的数据属性时,如果可能的话,将执行从字符串的转换:

<input data-can-assign="false" ...>
<input data-can-assign="true" ...>

然后 jQuery 会从这个调用中给你你想要的布尔值:

canAssign = $(this).data("canAssign")

当然,同样的修复也应该适用于所有其他字符串伪布尔值(不能完全与布尔运算符一起使用)。

原因是:"false"不完全是false"false" && x将评估为x(不是"false"您期望的)。另一方面,false && x将评估为false

于 2013-01-03T04:30:17.590 回答
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");
    }
}​

在进行更改的地方留下评论

于 2013-01-03T04:13:30.330 回答
0

正如其他人所指出的,字符串"true""false"的功能与布尔值true和不同false。如果您尝试在if语句中使用字符串或使用诸如 之类的逻辑运算符&&,则该字符串将被转换为布尔值;并且所有非空字符串都被转换为true(即它们是“真实的”)。这意味着字符串"false"将与您期望的相反,例如 in("false" && x)或 in if ("false") {...}

修复代码的一种方法是更改​​此行

               canAssignMultiple = canAssignMultiple && canAssign;

canAssign以明确且正确的方式转换为布尔值:

               canAssignMultiple = canAssignMultiple && (canAssign == "true");

然后&&运算符将正常工作,canAssignMultiple并将保存一个实际的布尔值。

并且(正如@mdmullinax 指出的那样,但我会以不同的方式做)一旦 canAssignMultiple 实际上是一个布尔值,您可以更改您的if语句以这样对待它们:

if (canAssignMultiple == "false") 

应该成为

if (!canAssignMultiple)

与相应的withdraw东西类似。

于 2013-01-03T04:15:22.503 回答