变量不更新其值

时间:2013-01-03 04:06:56

标签: javascript

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。如何做到这一点?

3 个答案:

答案 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"的功能与布尔值truefalse的功能不同。如果您尝试在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