我有以下html页面:
<html>
<body>
<script>
var check = 0;
function doNow()
{
void(d=document);
void(el=d.getElementsByTagName('INPUT'));
for(i=0;i<el.length;i++)
{
if(check == 0)
void(el[i].checked=1)
else
void(el[i].checked=0)
}
if(check == 0)
check = 1;
else
check = 0;
}
</script>
<HR>
<form>
<INPUT TYPE="CHECKBOX" name="DG1">DG1
<INPUT TYPE="CHECKBOX" name="DG2">DG2
<INPUT TYPE="CHECKBOX" name="DG3">DG3
<INPUT TYPE="CHECKBOX" name="DG4">DG4
<INPUT TYPE="CHECKBOX" name="DG5">DG5
<input type=button onclick="doNow()" value="CheckBox All Now">
</form>
</body>
</html>
如果单击“CheckBox All Now”,则会选中所有复选框。然后, 如果按下“后退”按钮或“刷新”按钮。 “CheckBox All now”必须单击两次以取消选中所有复选框。
如果是“刷新”或“返回”,请告诉我如何处理“CheckBox All Now”。
先谢谢, 马赫什。
答案 0 :(得分:2)
这是因为当重新加载页面时,会解析Javascript并声明您的声明
var check = 0;
毫不奇怪地导致check变量在此时重置为零。因此,在重新初始化页面后,首次单击该按钮将启用所有复选框。似乎这里的问题源于表单渲染器如何记住状态的差异,以及Javascript引擎如何记住“状态”。后者无法按照您希望的方式“固定”,因为每次都需要运行脚本。
您可能选择做的是将最初的“已检查”状态从控件本身中拉出来。您当前的代码明确假设复选框最初都将被取消选中(这基本上就是您所说的“check = 0”;这个变量存储了Javascript知道的复选框的状态)。相反,您可以将该行更改为:
var check = document.getElementsByTagName('INPUT')[0].checked;
当然,这在当前位置不起作用,因为它是在定义表单之前声明的。您可能需要将此注册为一个文档加载后要运行的闭包,或者将此行拉出并将其放入&lt; script&gt;在文档中的表单元素之后出现的标记(这不是最干净的方法,但它适用于快速和脏的开发;头部中的函数注册是一般的方法)。
我测试了两种方法并且它们都有效。我相信这个问题还有其他潜在的解决方案可以提出其他人的答案!
编辑:在考虑了一段时间之后进行大编辑。这里的基本问题是check
变量与实际的复选框本身不同步 - 我在上面描述的是一种在重新加载/重新初始化页面时避免这种情况的方法。
但是,您仍会遇到其他问题。如果用户手动点击所有复选框,会发生什么?它们现在将处于活动状态,但您的检查变量仍然是 0 ,因此单击“全部检查”按钮将全部激活它们(这将无效)。如果我单击此按钮并选中所有复选框,我会认为它的行为一致,无论这些复选框如何进入该状态(这应该是无关紧要的)。
此外,如果选中某些复选框并且某些复选框未选中,会发生什么?在这种情况下,意味着的按钮是什么?
总体上最好的解决方案可能是完全删除check
变量,而是在每个doNow
调用的开始时按需处理它。也就是说,检查复选框数组,读取它们的当前值,并从中导出复选框应设置为什么。 (例如,如果功能结果是每个复选框应该单独反转,这可能非常简单 - 这取决于实际的功能要求。)
(另外,作为编码样式问题,代码的部分是
if(check == 0)
void(el[i].checked=1)
else
void(el[i].checked=0)
可以简单地替换为
el[i].checked = (1 - check);
除了我们希望摆脱这个变量的事实之外,它应该是一个布尔而不是一个整数,因为它只有两个状态。)
答案 1 :(得分:1)
我的建议是使用复选框而不是按钮。当有人点击该复选框时,所有其他复选框将被设置为但是已设置该复选框。
因此,如果选中“全部检查”复选框,则单击它。所有其他复选框都将被清除。
在您描述的场景中应该更好一些。
答案 2 :(得分:0)
dtsazza是对的 - 当页面刷新时,你从头开始。
我注意到“立即检查”按钮实际上切换检查状态。 2个按钮怎么样(链接可能更好);一个检查全部,一个取消全部检查?
答案 3 :(得分:0)
您可以将checked
变量存储在隐藏字段中。这样,它会与复选框保持相同的寿命。