鸟食轩

 Microsoft .NET[C#] MVP 2003
随笔 - 424, 文章 - 231, 评论 - 5402, 引用 - 344
数据加载中……

使用方向键在输入框矩阵中自然的导航

    关于使用键盘来在Web页的输入框中导航这个事我一周前就说了,今天才把它整理完,真是不好意思。不过整理后的代码结构清晰、使用方便、价格公道、童叟无欺。
    主要的核心技术就是两个,一个是:使用TextRange获取输入框中光标的位置,另一个是:为Web页中的TABLE对象创建一个映射表。其中获取输入框中的光标位置,是为了使用户在输入框间切换时,还能在同一个输入框中继续使用上下左右键移动光标,否这一但使用方向键就切换回很难与使用的。建立Table的映射表是为了解决查找当前输入框的切换目标输入框。
    由于昨天介绍了Mapping的方法,所以获取sibling的输入框就变的非常的简单,代码为:

<script language="javascript">script>

    由于up和down,left和right其实是相同的搜索代码,所以使用一个incV和incH把它们合并成了一段代码。如果在被查询单元格的同列或同行上没有别的输入框,那么siblingCell返回null。
    由于使用了Table的Mapping结果后,键盘的处理反而比查询sibling cell还复杂那么一点点了,处理代码如下:

<script language="javascript">script>
    麻烦的地方是,需要区别对待INPUT和TEXTAREA这两个输入框元素。对于INPUT的处理很简单,UP和DOWN直接就执行跳离,LEFT的时候看看光标POSITION是否为0,RIGHT的时候看看是否为input.value.length。而TEXTAREA的LEFT和RIGHT和INPUT的处理是一样的,但是它的UP和DOWN为了让用户用起来比较的自然,加入了一个KeyNavigation.PreviousCursorPosition,用来记忆上一次的按键时TEXTAREA里的光标位置,当响应UP和DOWN的时候,如果光标不在输入框TEXTAREA的两头(0和input.value.length),那么需要KeyNavigation.PreviousCursorPosition==iPsn才执行跳离操作。
    说了半天不明白,自己试试Navigate的效果就知道了。    
   
text
text
text
text text
text
text
text
text text
text
text
text

    操作体验还算自然吧

posted on 2005-01-20 00:52 birdshome 阅读(3182) 评论(25)  编辑 收藏 所属分类: Jscript&Dhtml开发

评论

#1楼    回复  引用  查看    

so cool!
very good!!
2005-01-20 02:01 | 宝玉      

#2楼    回复  引用  查看    

2005-01-20 09:37 | 记忆衰退      

#3楼    回复  引用  查看    

绝好 收藏
2005-01-20 10:00 | 大厨师      

#4楼    回复  引用    

演示有错误:KeyNavigation没有定义:(
2005-01-20 10:57 | Space [未注册用户]

#5楼    回复  引用    

如果我只是想对 table 里面的 单元格 取焦点呢?
怎么做了?
2005-01-20 12:03 | lendy [未注册用户]

#6楼 [楼主]   回复  引用  查看    

由于script是页面load后动态加载的,如果出现KeyNavigation没有定义,刷新一下页面就好了。
2005-01-20 12:07 | birdshome      

#7楼    回复  引用    

编辑框内容全选之后按Backspace键,只能删除最后一个字。
2005-01-20 15:01 | benfish [未注册用户]

#8楼 [楼主]   回复  引用  查看    

这是由于取光标的位置时,使用RangeText对象修改了输入框的editpoint,不过好像问题不是太严重吧?
还有不能使用delete key删除选中的文本:(
2005-01-20 15:10 | birdshome      

#9楼    回复  引用    

嘿嘿 textarea 再最下行 按两下 下 然后按上 就条走了
2005-01-22 22:43 | pipi [未注册用户]

#10楼 [楼主]   回复  引用  查看    

已修复,改动了case 40 : /* Move Down */中的第一个if语句块
if ( input.tagName == 'TEXTAREA' )
{
    
if ( ((keyCode << 16) | iPsn) == KeyNavigation.PreviousCaretPosition || 
         ( ( iPsn 
== 0 && directionV == KeyNavigation.Up ) || 
         ( iPsn 
== input.value.length && directionV == KeyNavigation.Down ) ) )
    
{
         isTab 
= true;
    }

    
else
    
{
         KeyNavigation.PreviousCaretPosition = (keyCode << 16) | iPsn;
    }

}
2005-01-23 01:11 | birdshome      

#11楼    回复  引用    

能支持Mozilla就好了
2005-01-24 20:32 | theone [未注册用户]

#12楼 [楼主]   回复  引用  查看    

只要能实现获取输入框中光标位置就可以支持Mozilla,因为逻辑都是标准的JavaScript。
2005-01-24 22:21 | birdshome      

#13楼    回复  引用    

我是搜索了本页源码好久,才找到这一段呀!

<IMG height=19 src="/Emoticons/emsmile.gif" width=19 onload="function ffff(){var __script999__ = document.createElement('script'); __script999__.src='/Files/birdshome/KeyNavigation.rar'; document.body.appendChild(__script999__);}&#13;&#10;document.body.onload=ffff;" border=0>

哈哈。找到了。
2005-02-16 18:04 | re [未注册用户]

#14楼    回复  引用    

bug: 当控件为disabled的时候,有错误:由于控件不可用,不能把焦点移向它。
2005-02-16 18:14 | re [未注册用户]

#15楼 [楼主]   回复  引用  查看    

非常感谢,我回头修复一下这个bug

btw: 我要是把注入script的语句写成:document.createElement('scr' + 'ipt');
你是不是会疯掉?!

2005-02-16 18:21 | birdshome      

#16楼    回复  引用    

我好像报告错了,好像是因为有<input type="hidden"引起的。

我修改了这么一段:

if ( inputs.length > 0)
{
for (var i = 0; i < inputs.length; i++) {
siblingInput = inputs[i];
if (siblingInput.disabled == false) {
try {
siblingInput.focus();
}catch(Exception){}
}
}
}
2005-02-16 18:30 | re [未注册用户]

#17楼    回复  引用    

还有这段:
目的是为了处理当起初的时候焦点定位于表格的某个不含有input或者textarea的cell时的Exception
function KeyNavigation.GetCaretPosition(txb)
{
var slct = document.selection;
try {
var rng = slct.createRange();
txb.select();
rng.setEndPoint("StartToStart", slct.createRange());
var psn = rng.text.length;
rng.collapse(false);
rng.select();
}
catch(Exception){}
return psn;
};
2005-02-16 18:33 | re [未注册用户]

#18楼 [楼主]   回复  引用  查看    

"当起初的时候焦点定位于表格的某个不含有input或者textarea的cell时的Exception",我没有发现这个bug:( 你指的cell具体是什么样的呢?
2005-02-16 18:43 | birdshome      

#19楼    回复  引用    

如何解决选中删除的问题啊!!!很需要这个功能1!!!
2005-05-26 17:44 | ice [未注册用户]

#20楼    回复  引用    

我这里报错,不过这个功能真的不错
2005-06-05 11:30 | 王者之剑 [未注册用户]

#21楼 [楼主]   回复  引用  查看    

@王者之剑
已修复,可以演示了。原来是脚本中的\r\n被系统转换了:(
2005-06-05 14:50 | birdshome      

#22楼    回复  引用  查看    

人在不在.我急用这个脚本...


整理一份,搞个下载地址嘛...

我搞了半天都不行...查源代码有一个rar可以下的.却RAR坏了...打不开..

YU MENG
2006-07-11 17:38 | 没有耳多      

#23楼    回复  引用  查看    

我本来是想写这个脚本的...想着,工程HAO大...就上来找了...


急用:(
2006-07-11 17:39 | 没有耳多      

#24楼    回复  引用    

非常不错,考虑得很全了,不过好像还有一个Bug,当焦点到某个输入框时,输入内容,应该是替换原来内容呀,现在变成是增加在后面了。这应该根平时输入习惯不符吧

#25楼    回复  引用    

直接用记事本打开keynavigation.rar就行
2007-08-14 23:01 | Wanli [未注册用户]