我有一个javascript方法,它引入了几个键盘快捷键,包括一个覆盖现有浏览器命令的键盘快捷键。 Chrome和Firefox中的Ctrl-G
通常是转到增量搜索中的下一项(通常由Ctrl-F
启动)的命令。对于我的应用,我希望Ctrl-G
提示输入文档ID,并将用户带到相应的文档。
在我的本地主机上,它在Chrome和Firefox中均可正常运行。阻止了正常Ctrl-G
行为,并且提示正常显示。
当我在生产服务器上放置完全相同的代码时,Chrome仍能正常运行,但Firefox同时执行我的脚本操作和默认的Ctrl-G
操作。更糟糕的是,焦点/光标最终在增量搜索而不是提示对话框中,因此用户不能简单地忽略它并键入值。
我发现的所有其他类似问题都归结为event
没有在处理程序中定义,我已经做到了这一点。其他建议是立即event.preventDefault()
,但我只想在某些情况下preventDefault()
而不是其他情况。
$(document).bind('keydown', function(e) {
// ignore keyboard shortcuts when in an input
if (isFocusOnInput()) { return; }
// get which key was pressed (upper case if Shift, lower if not)
var key;
if (e.shiftKey) {
key = String.fromCharCode(e.which);
} else {
key = String.fromCharCode(e.which).toLowerCase();
}
// the shortcuts themselves.
if (key == 'h' && typeof hilightMyTasks == 'function') {
hilightMyTasks();
} else if (key == 'g' && (e.ctrlKey || e.metaKey)) {
e.preventDefault();
id = prompt('Enter task id','');
if (id) {
if (Number(id) == id && id % 1 == 0 && id > 0) {
window.location.href='/index.php?m=tasks&a=view&task_id='+id+'&tab=0'
} else {
alert('Invalid task id!');
}
}
}
});
如果它是相关的,isFocusOnInput()
方法:
function isFocusOnInput() {
var focusType = document.activeElement.type;
if (focusType == 'text' || focusType == 'textarea' || focusType == 'select-one' ||
focusType == 'checkbox' || focusType == 'radio' || focusType == 'select-multiple' ||
focusType == 'password' || focusType == 'hidden' || focusType == 'submit' ||
focusType == 'reset' || focusType == 'image' || focusType == 'number' ||
focusType == 'color' || focusType == 'date' || focusType == 'datetime' ||
focusType == 'datetime-local' || focusType == 'email' || focusType == 'month' ||
focusType == 'range' || focusType == 'search' || focusType == 'tel' ||
focusType == 'time' || focusType == 'url' || focusType == 'week' ||
focusType == 'button') {
return true;
}
return false;
}