我已经检查过了,如果这是别人问的。但是,每个问题都是关于输入或文本区域,没有完美的答案给我。请注意,我希望这工作在div键下。我已经设置了div tabindex,我可以在keydown事件中获取该div的键代码。
我正在使用jQuery在javascript中创建电子表格。并且,在电子表格中,用户开始在任意行、任意列的任意单元格上键入。现在,我想检测是否按下了一个有效的字符,以便在选中的单元格中立即显示编辑文本框。
所以,当我转换keyCode字符使用String.fromCharCode,我得到一个字符的一切,即使它是shift键或ctrl键。所以,这不是我想要的。这将为shift &比如g
我不知道如何检查是否只有一个有效的字符,如a, h, 0, 7等被用户按下,这样我就可以像google sheets或microsoft excel那样立即向他展示编辑单元格。另外,我还可以检查>= 65等等。但是,我想让它适用于每种语言的每种类型的键盘。
我知道这是一项非常困难的工作,但我想知道谷歌和微软是如何做到的。
我自己解决的。
当keydown
事件为div发生时,我创建一个input
框并将其附加到body,并将keyup
事件附加到该输入框。在keyup
事件中,我可以很容易地发现是否键入了某些内容。如果输入了什么,那么用户想要编辑单元格,否则我可以检查特殊键,如Ctrl+结束, Ctrl+Home等等。
请注意,当用户开始输入时,输入看起来很烦人。所以,我把它放在-1000px
和position:absolute
的某个地方。我还尝试使输入框width
和height
0,但后来我无法从框中读取.val()
。所以,我用position:absolute; left:-1000px
代替。
可能这有助于别人在任何其他相关的事情。下面是代码。
$(spreadsheet).keydown(function(e) {
if (e.keyCode == /*movement_keys*/) {
//move between cells
} else {
var input = $('<input type="text" style="position:absolute; left: -1000px; top: 0px;"/>').appendTo('body');
$(input).focus();
$(input).keyup(function(e) {
if ($(this).val() != '') {
setTimeout(function() { spreadsheet.editCell($(this).val()); }, 1);
}
$(this).remove();
$(spreadsheet).focus();
});
}
});
我必须等待1ms
使用setTimeout
功能使焦点完美,否则焦点不会在单元格编辑器上进行。