我有一个类似这样的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'"
在网格视图渲染时,headerCheckBoxID
和myGridViewClientID
都在代码隐藏中设置。
我们的想法是,当选中标题中的复选框时,它会将所有其他复选框设置为相反的选中状态,然后触发其点击事件以模拟点击,并触发其onclick操作(涉及事物)比如更改行的颜色,如果选中行的数据键,则将其设置为SelectedValues数组等。
但是,我还希望子复选框具有以下行为: 1)如果取消选中任何一个,请取消选中“全选”复选框。 2)如果检查了所有这些,请选中“全选”复选框。
现在,因为子复选框的click事件有机会更改headercheckbox的已检查状态,当循环返回到“checkall”事件时,headercheckbox的状态与首次启动时的状态不同,因此,在尝试全部选择时,它最终只会检查第一个子复选框。
使用警报,我能够看到在CheckSelectAll函数中更改了headercheckbox的已检查状态时,对于产生CheckSelectAll函数的CheckAll函数中的“isMeChecked”值,该值也会更改。
那看起来非常像参考变量。我不知道如何阻止它这样做。
答案 0 :(得分:4)
想一想。假设x.checked = true。运行doSomething(x)。 当函数启动时,me.checked为true。现在看看你的for循环:
传递1:me.checked是真的。所以isMeChecked是真的。所以你把me.checked设置为false。
传递2:me.checked是假的。 isMeChecked仍然是正确的,因为你不在循环中改变它。所以me.checked再次设置为false。
传球3:见第2传球。 ...
当函数退出时,isMeChecked为true,me.checked为false。你所做的就是将me.checked设置为false 10次。 这不是isMeChecked作为参考的问题(因为它不是),但如果你期望得到不同的结果,那只是你逻辑中的一个错误。
答案 1 :(得分:0)
除非我疯了,否则在javascript中没有引用布尔值的东西。他们总是按价值传递。您可以粘贴我们可以运行的完整示例代码而无需填写任何空白吗?
答案 2 :(得分:0)
你的循环刚好坏了 - 阅读评论
// doSomething({checked:true});
function doSomething(me) {
// isMeChecked = true;
var isMeChecked = me.checked;
for (i=0;i<=10;i++) {
// me.checked = false ... always...
me.checked = !isMeChecked;
alert (me.checked);
}
}
答案 3 :(得分:-2)
你可以var isMeChecked = me.checked?true:false;
此外,me.checked != isMeChecked
与me.checked = !isMeChecked
不同,这可能与您的意图相同。