【发布时间】:2019-08-07 18:56:17
【问题描述】:
我有一个简单的 html 页面,附有 webgl 画布和 javascript。在脚本中,我监听画布的“keydown”、“keypress”和“keyup”事件。在事件处理程序中,我登录以在触发事件时进行调试。如果我在“keydown”处理程序中的事件对象上调用 preventDefault(),我将不再收到“keypress”事件,并且想知道这是否是预期的行为?因此,如果我按下例如“a”之类的字符键,则会触发 keydown 和 keyup 事件,但只有在 keydown 事件处理程序中未调用 preventDefault() 时才会调用 keypress。
到目前为止,我在 windows、firefox 和 chrome 上对此进行了测试。
index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Main</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui" />
<meta name="format-detection" content="telephone=no" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="mobile-web-app-capable" content="yes" />
<style>
body,html { margin:0; padding:0; background-color:black; width:100%; height:100%; }
canvas#webgl { width:100%; height:100%; }
</style>
</head>
<body>
<canvas id="webgl" tabindex="0"></canvas>
<script type="text/javascript" src="test_canvaskeypress.js"></script>
</body>
</html>
test_canvaskeypress.js:
var canvas = document.getElementById("webgl");
canvas.addEventListener('keydown',this.onKeyDown,false);
canvas.addEventListener('keyup',this.onKeyUp,false);
canvas.addEventListener('keypress',this.onKeyPress,false);
function onKeyDown(e) {
console.log('keyup: '+e.keyCode);
e.preventDefault();//prevents the keypress event, is this intended behavior?
e.stopPropagation();
}
function onKeyUp(e) {
console.log('keydown: '+e.keyCode);
e.preventDefault();
e.stopPropagation();
}
function onKeyPress(e) {
console.log('keypress: '+e.key);
e.preventDefault();
e.stopPropagation();
}
我不知道会发生什么,因为 preventDefault 的文档信息量不是很大,但我认为应该出现一个按键事件,尽管在 onKeyDown() 中调用了 preventDefault,因为按键事件也被触发了。
【问题讨论】:
标签: javascript html