正愁晚上没事做,正在QQ上玩欢乐斗地主,很闲.看到楼主的问题了,又有事情做了.所以又写了个例子.
由于很少在Firefox下面进行开发,一直都是针对于IE的开发,所以我的程序对Firefox的兼容都不是很好,不过代码具体的思路都是差不多的:
[code="js"]<br>
function keyDown(){<br>
var iekey=event.keyCode;<br>
var realkey=String.fromCharCode(event.keyCode);<br>
var grid=document.getElementById("myGrid");<br>
var order=event.target||event.srcElement;//得到当前的事件对象.<br>
if(order.tagName=="INPUT"){ <br>
//MoveData:存储移动光标时的状态数据,避免在后面的四个方法中重复写相同的代码.<br>
var MoveData={<br>
grid:grid,//表格对象<br>
curRow:order.parentNode.parentNode.rowIndex,//行索引<br>
curCol:order.parentNode.cellIndex,//列索引<br>
rowCount:grid.childNodes[0].childNodes.length,//总行数<br>
colCount:grid.childNodes[0].childNodes[0].childNodes.length//总列数<br>
}<br>
var moveConfig=null;//存储符合条件的单元格坐标.<br>
switch (iekey){<br>
case 37:moveConfig=getMoveLeft(MoveData);break;<br>
case 38:moveConfig=getMoveUp(MoveData);break;<br>
case 39:moveConfig=getMoveRight(MoveData);break;<br>
case 40:moveConfig=getMoveDown(MoveData);break;<br>
default:return false;<br>
}<br>
if(moveConfig!=null){//找到符合标准的单元格,并选中.<br>
grid.childNodes[0].childNodes[moveConfig.Y].childNodes[moveConfig.X].childNodes[0].select();<br>
}<br>
}<br>
}<br>
function getMoveLeft(Data){<br>
if(--Data.curCol<0){//若该单元格为第一列<br>
if(--Data.curRow>=0){//若上一行不为空<br>
Data.curCol=Data.colCount;//将Data中的curCol设置为上一行的最第一列之后.<br>
return getMoveLeft(Data);//继续向左搜索<br>
}<br>
return null;<br>
}else if(Data.grid.childNodes[0].childNodes[Data.curRow].childNodes[Data.curCol]==null){<br>
return null;<br>
}else if(Data.grid.childNodes[0].childNodes[Data.curRow].childNodes[Data.curCol].firstChild.tagName!="INPUT"){<br>
//若该行不是文本框,则继续向左搜索.<br>
return getMoveLeft(Data);<br>
}<br>
return {X:Data.curCol,Y:Data.curRow};//若到找符合条件的单元格,则将其坐标返回.<br>
}///只做这一个注释吧,后面的思维和这个差不多,懒得写了.</p>
<p>function getMoveRight(Data){<br>
if(++Data.curCol>=Data.colCount){<br>
if(++Data.curRow<Data.rowCount){<br>
Data.curCol=-1;<br>
return getMoveRight(Data);<br>
}<br>
return null;<br>
}else if(Data.grid.childNodes[0].childNodes[Data.curRow].childNodes[Data.curCol]==null){<br>
return null;<br>
}else if(Data.grid.childNodes[0].childNodes[Data.curRow].childNodes[Data.curCol].firstChild.tagName!="INPUT"){<br>
return getMoveRight(Data);<br>
}<br>
return {X:Data.curCol,Y:Data.curRow};<br>
}</p>
<p>/**<br>
由于按向上键或向下键时,如果下方没有单元格,只有左边和右边有的话.<br>
没办法知道用户到底是要选中左边还是右边.若随便选中后,和用户想象<br>
中的选择不一样,体验会不太好.所以只做了垂直的向上和向下移动.<br>
**/<br>
function getMoveUp(Data){<br>
if(--Data.curRow<0||Data.grid.childNodes[0].childNodes[Data.curRow].childNodes[Data.curCol]==null)return null;<br>
else if(Data.grid.childNodes[0].childNodes[Data.curRow].childNodes[Data.curCol].firstChild.tagName!="INPUT"){<br>
return getMoveUp(Data);<br>
}<br>
return {X:Data.curCol,Y:Data.curRow};<br>
}<br>
function getMoveDown(Data){<br>
if(++Data.curRow>=Data.rowCount||Data.grid.childNodes[0].childNodes[Data.curRow].childNodes[Data.curCol]==null)return null;<br>
else if(Data.grid.childNodes[0].childNodes[Data.curRow].childNodes[Data.curCol].firstChild.tagName!="INPUT"){<br>
return getMoveDown(Data);<br>
}<br>
return {X:Data.curCol,Y:Data.curRow};<br>
}<br>
6908741329326 |
ewfdsfsdf |
|
dfsdfsdf |
|
dfsdfsd |
6908741329326 |
ewfdsfsdf |
|
dfsdfsdf |
|
dfsdfsd |
|
[/code]
测试一下,IE下可以运行,没问题了,我也睡觉去了. :arrow: