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

変数 canAssignMultiple は、each() 関数が 2 回目に呼び出されたときに 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-。キャメルケースをハイフンケースに変更することもできます。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"同じように機能しません。ステートメントまたは などの論理演算子で文字列を使用しようとすると、文字列はブール値に変換されます。空でないすべての文字列が変換されます(つまり、それらは「真実」です)。これは、文字列が inや in など、予想とは逆に機能することを意味します。truefalseif&&true"false"("false" && x)if ("false") {...}

コードを修正する 1 つの方法は、この行を変更することです

               canAssignMultiple = canAssignMultiple && canAssign;

canAssign明示的かつ正しい方法でブール値に変換するには:

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

その後、&&演算子は正しく機能しcanAssignMultiple、実際のブール値を保持します。

そして(@mdmullinaxが指摘したように、私は別の方法で行います)canAssignMultipleが実際にブール値になったら、ifステートメントを変更してそれらをそのように扱うことができます:

if (canAssignMultiple == "false") 

なるべき

if (!canAssignMultiple)

同様に、対応するwithdrawものも同様です。

于 2013-01-03T04:15:22.503 に答える