我有一个JavaScript函数,它是这样的:使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')"
在网格中的其余复选框全部,有自己的点击数事件设置为onclick="CheckSelectAll(this, 'headerCheckBoxID', 'myGridViewClientID'"
无论是headerCheckBoxID
和myGridViewClientID
在代码隐藏设置时,在GridView正在渲染。
的想法是,当在标题中的复选框被选中,将设置所有其他复选框以相反的检查状态,然后触发其click事件模拟点击,并且也火了他们的onclick行动(其中包括比如改变行的颜色,将行的数据键设置为SelectedValues数组(如果选中)等等)。
但是,我也希望子复选框具有以下行为: 1)如果其中任何一个未选中,请取消选中“全选”复选框。 2)如果所有人都选中,请选中“全选”复选框。
现在,由于子复选框的click事件有机会更改headercheckbox的checked状态,因此当循环返回到“checkall”事件时,headercheckbox的状态与第一次启动时的状态不同,所以它最终只会在尝试全选时检查第一个子复选框。
使用警报,我能看到,当headercheckbox的选中状态在CheckSelectAll功能发生变化时,该值也变在其中产卵CheckSelectAll功能CheckAll功能“isMeChecked”值。
那看起来很像一个参考变量。我不知道如何阻止它做到这一点。
什么是你的问题? isMeChecked不是对me.checked的引用,你的问题在别处。 – erikkallen 2010-02-04 01:26:28
您的示例代码有问题。假设我通过{checked:true}作为doSomething的参数,每次都会得到完全相同的值。另外,什么是me.checked!= isMeChecked应该这样做?这是一个无用的陈述,假设检查不是一个有副作用的setter。 – 2010-02-04 01:27:15
我正在写内存中的代码,所以它有一个错字。我将“me.checked!= isMeChecked”改成了“me.checked =!isMeChecked”,这是我真正与我合作的实际样本中的实际情况。 在真实的代码中,我有一个复选框,它有一个调用函数的onclick事件。该函数将页面上其他几个复选框的选中状态设置为原始复选框的相反值,然后调用这些复选框的onclick事件。 儿童复选框的onclick事件有时会更改父复选框的选中值,然后混淆循环。 – 2010-02-04 01:33:34