“f.selAll”,它有一个属性“checked”,复选框选中时取值为“true”,否则为“false”。当第7行“if”语句的条件成立时,说明“全选”复选框处于选中状态,则对上面的所有复选框作循环,一个一个都选中。注意这里采用的方法,没有直接用名称引用复选框(如“f.cb0”),而是使用了“elements”数组,这次没有用数组下标,而是使用了名称,而名称是用变量表示的。这种引用方法比较多地应用在这样的场合。“else”后面就是“全选”复选框没有处于选中状态,则取消所有复选框的选中。 由于用户有可能单独点击上面的某些复选框,当点击了某复选框后,有可能使得原先是“全选”的情况变成了“不是全选”,所以需要相应调整“全选”复选框的状态。第19行到第34行的函数“cb()”给出了一种参考思路:如果“全选”复选框当前是选中状态,说明上面的所有3个复选框都是选中的,那么这时如果某一个复选框被点击,肯定是不被选中了,那么“全选”复选框自然就要“不选中”了。而如果“全选”框当前不是选中状态,说明上面的复选框或者都没被选中,或者有一部分没被选中,只能一个一个地看了。这里是这样处理的:遍历3个复选框,逐个查看其状态,只要有一个没有处于选中状态,就退出函数,因为至少有一个不是选中状态,所以“全选”框维持原来的“不选中”状态。只有遍历所有复选框,都是选中状态时,才需要把“全选”框也置为“选中”。第29行“if”参数中的“!”,表示对后面的表达式的结果取相反值,相当于写成“f.elements[\= = false”。
最后,重新审视函数“selectAll()”,是不是觉得有点罗嗦呢?想想看是不是可以精简一下呢?请参考本例源文件。
3.6 示例:弹出窗口
3.6.1 示例说明
访问网站时不断有窗口弹出来,可说是件极其烦人的事情,于是现在的浏览器甚至直接就不允许弹出窗口了。但在实际MIS系统中,弹出窗口还是有用武之地的。本例演示用户填写某表单后,弹出新窗口显示用户的输入内容,并要求用户确认。用户确认后该窗口关闭,从原窗口提交表单。 本例涉及Javascript语法: ? 弹出窗口的写法
? 用代码直接生成文档内容 ? 弹出窗口与原窗口的交互
3.6.2 解决方案
这个问题的复杂之处在于:新弹出的窗口要包含用户输入的内容,也就是是动态内容,无法事先确定的。另外,在弹出窗口确认后要关闭该窗口且回到原窗口并提交表单,也是个不大不小的挑战。请参考下面的源文件清单。 1.
2.
清单 3-7 联动菜单
第48行的“for”循环是Javascript比较独特的写法,“t1”是数组,“i”是循环变量,这种写法是用于遍历数组。还请注意,对于下拉列表框,获取用户选择项、定义新的列表框都有比较独特的写法,比表单中的一般控件要麻烦一些。另外,针对列表框的事件,本例只有当前面列表框选择项有变化时才需调整后面列表框内容,所以响应的是“onChange()”方法(第42、43行)。其他请参考源码中的注释。
19