2010-02-04 61 views
1

我有一个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'"

无论是headerCheckBoxIDmyGridViewClientID在代码隐藏设置时,在GridView正在渲染。

的想法是,当在标题中的复选框被选中,将设置所有其他复选框以相反的检查状态,然后触发其click事件模拟点击,并且也火了他们的onclick行动(其中包括比如改变行的颜色,将行的数据键设置为SelectedValues数组(如果选中)等等)。

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

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

使用警报,我能看到,当headercheckbox的选中状态在CheckSelectAll功能发生变化时,该值也变在其中产卵CheckSelectAll功能CheckAll功能“isMeChecked”值。

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

+0

什么是你的问题? isMeChecked不是对me.checked的引用,你的问题在别处。 – erikkallen 2010-02-04 01:26:28

+0

您的示例代码有问题。假设我通过{checked:true}作为doSomething的参数,每次都会得到完全相同的值。另外,什么是me.checked!= isMeChecked应该这样做?这是一个无用的陈述,假设检查不是一个有副作用的setter。 – 2010-02-04 01:27:15

+0

我正在写内存中的代码,所以它有一个错字。我将“me.checked!= isMeChecked”改成了“me.checked =!isMeChecked”,这是我真正与我合作的实际样本中的实际情况。 在真实的代码中,我有一个复选框,它有一个调用函数的onclick事件。该函数将页面上其他几个复选框的选中状态设置为原始复选框的相反值,然后调用这些复选框的onclick事件。 儿童复选框的onclick事件有时会更改父复选框的选中值,然后混淆循环。 – 2010-02-04 01:33:34

回答

4

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

通过1:me.checked是真的。所以MeChecked是真的。所以你把me.checked设置为false。

通过2:me.checked为false。 isMeChecked仍然是真的,因为你不会在循环内改变它。所以me.checked再次设置为false。

通过3:见绕道2. ...

当函数退出,isMeChecked是真实的,me.checked是假的。你所做的一切都是把我设定为假10次。 这不是isMeChecked作为参考的问题(因为它不是),而只是在您的逻辑中出现错误,如果您期待不同的结果。

+0

好吧,根据我的测试,IsMeChecked正在改变当我。检查改变了。这就是为什么我认为它是一个参考变量。 – 2010-02-04 13:19:32

+0

你可能没有做正确的测试。检查很简单。试试这个:var me = {checked:true}; var isMeChecked = me.checked; isMeChecked = false; alert(me.checked)'。即使isMeChecked设置为false,您也会看到me.checked仍然成立。 – glomad 2010-02-04 15:18:52

-2

你可以做var isMeChecked = me.checked?true:false;

而且,me.checked != isMeChecked是不一样的me.checked = !isMeChecked,这是你预期大概是什么。

+0

啊是的,你是正确的先生。我从记忆中这样做。这是我在办公室正在做的事情,并没有在我面前的代码。最重要的是,我不是一个JavaScript大师,所以这会增加错误。 =) 我会在早上第一时间尝试你的建议。谢谢! (修复了原信息中的错误) – 2010-02-04 01:25:13

+4

me.checked?true:false is nonsense – erikkallen 2010-02-04 01:25:57

+0

Is not var isMeChecked =(me.checked)?true; false;像C#中的“条件运算符”的例子? – 2010-02-04 01:37:49

0

除非我疯了,否则没有这样的事情在javascript中引用布尔值。它们总是以价值传递。你可以粘贴完整的示例代码,我们可以运行而不填充任何空白?

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