我有一个JavaScript函数,它像这样:

function doSomething(me) {
        var isMeChecked = me.checked;
        for (i=0;i<=10;i++) {
            me.checked = !isMeChecked;
            alert (me.checked);
        }
    }


我假设isMeChecked在第一次加载后将保持不变,但是显然它是me.checked的引用变量,因此每次迭代都会改变。
我如何强制isMeChecked设置为首次加载时的me.checked值,而不是me.checked的引用?

好了,为了更清楚一点,我正在编辑这篇文章,以显示正在使用的实际代码表现出不良行为:

这是JavaScript函数:

function CheckAll(me, gridViewId) {
    var isMeChecked = (me.checked)?true:false;
    alert('CheckAllFired_1');
    Parent = document.getElementById(gridViewId);
    for (i = 0; i < Parent.rows.length; i++) {
        alert('CheckAllFired_2_' + i.toString());
        var tr = Parent.rows[i];
        var td = tr.childNodes[0];
        var item = td.firstChild;
        if (item.id != me.id && item.type == "checkbox") {
            alert('CheckAllFired_3_' + i.toString() + '_' + me.checked + '_' + isMeChecked);
            item.checked = !isMeChecked;
            item.click();
        }
    }
}
function CheckSelectAll(me, checkBoxHeaderId, gridViewId) {
    alert('CheckSelectAllFired_1');
    if (!me.checked) {
        alert('CheckSelectAllFired_2');
        document.getElementById(checkBoxHeaderId).checked = false;
        return;
    }
    else {
        alert('CheckSelectAllFired_3');
        document.getElementById(checkBoxHeaderId).checked = true;
        Parent = document.getElementById(gridViewId);
        for (i = 0; i < Parent.rows.length; i++) {
            alert('CheckSelectAllFired_4_' + i.toString());
            var tr = Parent.rows[i];
            var td = tr.childNodes[0];
            var item = td.firstChild;
            if (item.type == "checkbox") {
                alert('CheckSelectAllFired_5_' + i.toString());
                if (!item.checked) {
                    alert('CheckSelectAllFired_6_' + i.toString());
                    document.getElementById(checkBoxHeaderId).checked = false;
                    return;
                }
            }
        }
        return;
    }
}


我有一个asp.net gridview。第一列是一列复选框,标题中也有一个复选框,可切换列中其他复选框的“全选/取消全选”。
标头中的复选框将其onclick事件设置为onclick="CheckAll(this, 'myGridViewClientID')"

网格中所有其余的复选框,其onlick事件都设置为onclick="CheckSelectAll(this, 'headerCheckBoxID', 'myGridViewClientID'"

渲染gridview时,headerCheckBoxIDmyGridViewClientID都在代码隐藏中设置。

想法是,当标头中的复选框被选中时,它将所有其他复选框设置为相反的选中状态,然后触发其click事件以模拟单击,并触发其onclick操作(包括更改他们的行的颜色,如果已选中则将行的数据键设置为SelectedValues数组,等等)。

但是,我还希望子复选框具有以下行为:
1)如果其中任何一个未被选中,请取消选中“全选”复选框。
2)如果全部选中,请选中“全选”复选框。

现在,由于子复选框的click事件有机会更改headercheckbox的选中状态,因此当循环返回到“ checkall”事件时,headercheckbox的状态将与第一次启动时不同,因此最终在尝试进行全选时仅选中第一个子复选框。

使用警报,我可以看到,当在CheckSelectAll函数中headerheadbox的选中状态发生更改时,该值也随CheckAll函数中的“ isMeChecked”值发生了变化,而该值又产生了CheckSelectAll函数。

那看起来很像参考变量。我不知道如何阻止它这样做。

最佳答案

想一想。假设x.checked = true。运行doSomething(x)。
函数启动时,me.checked为true。现在来看一下您的for循环:

通行证1:me.checked为true。所以isMeChecked为true。因此您将me.checked设置为false。

密码2:me.checked为假isMeChecked仍然为true,因为您无需在循环内更改它。因此me.checked再次设置为false。

通道3:请参见通道2。
...

当函数退出时,isMeChecked为true,而me.checked为false。您所做的全部都设为me.check为false 10次。
这不是isMeChecked作为参考(因为不是参考)的问题,如果您期望得到不同的结果,则只是逻辑上的错误。

关于javascript - 使javascript引用变量成为值变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2196763/

10-10 00:40