我有一个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时,
headerCheckBoxID
和myGridViewClientID
都在代码隐藏中设置。想法是,当标头中的复选框被选中时,它将所有其他复选框设置为相反的选中状态,然后触发其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/