使用javascript检测硬件键盘状态的最佳跨浏览器和跨平台方法是什么?
答案 0 :(得分:6)
这可能是一个老问题,但几个月前,我一直在寻找解决方案。我正在构建一个消息传递系统,当有人在物理键盘上点击use strict;
use Text::CSV;
my $csv = Text::CSV->new ( { binary => 1 } );
open my $IN, "<:encoding(utf8)", "file.csv" or die;
while (my $row = $csv->getline($IN)) {
if (@$row > 5) {
$csv->combine(@$row);
print $csv->string(), "\n";
}
}
close $IN;
时会发送消息,但当某人在虚拟键盘上点击Return
时会插入换行符。我解决它的方法是计算Return
和keydown
事件之间的时间,并获得keyup
被击中时的平均值。
我终于在我的博客here上记录了它。
答案 1 :(得分:3)
JS中的键盘可通过委托给OS API的浏览器API访问,但无法判断是否有物理键盘。我现在可以从物理键盘上剪下线,打开虚拟键盘,用鼠标点击屏幕按钮,浏览器仍然会触发脚本正在收听的每个键盘事件。从浏览器/ JS的角度来看,虚拟键盘与物理键盘无法区分。
“存在”甚至意味着什么?如果我有一个带触摸屏和滑出式键盘的手机,您是否希望浏览器触发某种“keboardIn”/“keyboardOut”事件?与电缆插入/拔出相同? :)
如果您的应用绝对需要物理键盘,请通知/询问用户。
编辑 - 在OP澄清之后:
你知道facebook聊天吗?您只需按下即可发送消息 “输入”,我必须向没有键盘按钮的用户显示 替换“回车”键。
所以只需创建一个带有文本输入的表单并听取输入/表单事件。大多数(每个?)软键盘都有某种“完成”,“就绪”或类似按钮。您不需要知道“keyCode”是否等于“13”,而是检测用户是否有意提交他键入的内容。或者,作为最后的手段,检测我启用触摸的设备然后显示按钮。 (if('ontouchstart' in document.documentElement)/* show touch sbmit button */
)
答案 2 :(得分:3)
你能尝试理论上的反面吗?而不是试图检测键盘硬件,为什么不尝试检测触摸屏?使用ontouchstart
事件;
if ('ontouchstart' in document.documentElement) {
// show icon
}
答案 3 :(得分:2)
使用键盘事件来检测用户是否有键盘(他/她可能会按下键盘)。将其保存在localStorage中,浏览器将在下次记住它。
var app = this;
app.hasKeyboard = false;
this.keyboardPress = function() {
app.hasKeyboard = true;
$(window).unbind("keyup", app.keyboardPress);
localStorage.hasKeyboard = true;
console.log("has keyboard!")
}
$(window).on("keyup", app.keyboardPress)
if(localStorage.hasKeyboard) {
app.hasKeyboard = true;
$(window).unbind("keyup", app.keyboardPress);
console.log("has keyboard from localStorage")
}
答案 4 :(得分:-4)
if (confirm('Do you have hardware keyboard?')) {
} else {
}
根据问题评论中的说明进行编辑:
支持每次“输入”并为触摸屏添加“发送”图标(What's the best way to detect a 'touch screen' device using JavaScript?)和鼠标的“悬停”伪类怎么样?