思路有用,实际无用 前段时间在项目中遇到一个表格中要批量录入非常多的数据,鼠标键盘操作令人眼花缭乱,顿有想法要做个利用键盘的上下左右键切换输入框焦点的小插件。 要实现的功能为: 上键:焦点到上一行相同列的input, 下键:焦点到下一行相同列的input, 左键:焦点到本行左边相邻的input, 右键:焦点到本行右边相邻的input 当然这里说的input都在一个table中的所有的input。既然是要通过键来实现,我只能想到通过keydown的事件来处理了,通过测试,那个几个键的code分别为: 上键:38,下键:40,左键:37,右键:39.当keycode等于这几个值时我就进行处理,这里用switch行,用if,esle也可以,我比较喜欢用后者 比较关键的地方是要找到按键后焦点该去哪个input。 如果利用jquery,首先会想到的就是查找父元素中的符合条件的input的下一个,在同一个tr中这个比较好找,但如果当前元素是本行的最后一个,如果输入右键,焦点应该跳到下一行的第一个inpput,这时候就麻烦了。并且如果单纯的利用dom就那样find来find去,很难达到目的。 上下键的切换只要找到input间相对应的index就可以了。中间本来想通过input所在的单元格的索引来查找查找上行或者下行的同列的单元格中的input,但通过parents查找的td总是与通过tr>td中超找的相对应的td不相等,利用chome调试只有选择器有区别,其他属性都一致,可就是用index方法找不出来,始终是-1...此路就此终结 不得不采用终极解决方案:在input上加属性,存储他是第几行第几列,到时直接取出,去找上下行的第几列就得了,所以在遍历的符合条件的input时加上这句
inputRowIndex为行的索引,j为列的索引. 现在就要考虑每次要从哪去查找那些input,如果通过jquery的dom去找,每次keydown都去find,效率自然会比较低,为什么低不太好解释。这里显然用变量来存储所有的input会高效些。但又如何实现很方便的查找呢? 比较自然的我就会想到构造一个table那样的立体结构来存储,一行一行的保存,并且都是按顺序的存储,并且我能在每个元素上取到我想要的东西,比如当前元素是第几行,第几列。我能很方便的获取数据,比如我传递第几行,第几列过去就能很方便的获取对应的input。这两样东西js都有现成的了,第一个用json,第二个,嘿嘿,非数组不能那样方便高效的获取数据了,于是我定义出如下数据格式
这样我能比较方便的找到当前元素的第几行,第几列,然后根据keycode来计算要获得焦点的input:(查看了排版,源代码还是直接在下面看好了)
完整源代码如下:
调用很简单: new tabTableInput("tblGrid","text"); 至于后面那个参数,看下源代码就得了 |
|