当前位置:嗨网首页>书籍在线阅读

32-讨论

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

10.7.3 讨论

为什么要绑定 keydownkeyup 事件?

可以只使用 keydown 事件。但是,当用户完成第一个输入字段时,下一个按键会使焦点设置为第二个输入字段,没有任何视觉提示。通过使用 keyup 事件,在填写第一个输入字段之后,第二个输入字段获得焦点,光标放在输入字段的开始位置,大部分浏览器会用边框或者其他高亮状态表示焦点。而且,在当前输入字段为空时,Backspace键需要 keyup 事件才能将焦点设置为前一个输入字段。

也可以只使用 keyup 事件。但是,如果光标在第二个输入字段中,打算使用Backspace键清除该字段,一旦删除了所有字符,焦点就会移到第一个输入字段。遗憾的是,第一个字段已经填满,所以下一个击键会因为 maxlength 属性而丢失,然后 keyup 事件将把焦点又设置为第二个输入字段。丢失击键是很糟糕的事情,所以在 keydown 上执行相同的检查,这样在字符丢失之前会将光标移到下一个输入字段。

因为这一逻辑不是CPU密集的,所以可以同时绑定 keydownkeyup 事件没什么问题。在其他情况下,可能需要采用更具选择性的方案。

你将会注意到, ignoreKeycodes 变量是一个字符串。如果我们打算动态地构建该变量,创建一个数组,然后使用 JavaScript.join(', ').toString() 方法会更快捷。但是因为字符串值始终相同,从一开始就将它编码为一个字符串更简单。因为担心出错,我让 ignoreKeyCodes 以逗号开始和结束。这样,当搜索前后加上逗号的 keycode 时,就能保证只找到你想找的数字——如果搜索的是 9 , 不会找到 19 或者 39

注意,没有用来阻止在最后一个 <input> 元素上执行 $this.next().focus() 的代码。这里利用了jQuery链。如果 $this.next() 什么也没找到,则方法链停止——它无法用 .focus() 将焦点设置在找不到的元素上。在不同的场景中,预先缓存任何已知的 .prev().next() 元素可能是有意义的。

当禁用JavaScript时会发生什么情况?什么也不会发生,用户必须手动单击,从一个文本输入字段转到下一个字段。