我正在尝试在调度的事件对象上设置keyCode。
单击按钮,会在文本框控件上引发事件以模拟keydown事件。事件成功引发,但keyCode为0.我需要将具有正确keyCode的事件对象发送到文本框。 我一直在使用here中的代码。
如何在调度事件中设置keyCode值?
<html>
<head>
</head>
<body>
<input type="button" id="btn" value="Click"></input>
<input type="text" id="txt"></input>
<script>
document.getElementById('btn').addEventListener("click", btnClick);
document.getElementById('txt').addEventListener("keydown", txtKeydown);
function btnClick(e) {
var txt = document.getElementById('txt');
var dispatchKeyboardEvent = function(target, initKeyboradEvent_args) {
var e = document.createEvent("KeyboardEvents");
e.initKeyboardEvent.apply(e, Array.prototype.slice.call(arguments, 1));
e.keyCode = 83;
e.charCode = 0;
target.dispatchEvent(e);
};
var canceled = !dispatchKeyboardEvent(txt,
'keydown', true, true, // type, bubbles, cancelable
window, // window
's', // key
0, // location: 0=standard, 1=left, 2=right, 3=numpad, 4=mobile, 5=joystick
false, false, false); // Ctr, Alt, Shift
}
function txtKeydown(e) {
console.dir(e);
console.log(e.keyCode);
}
</script>
</body>
</html>
答案 0 :(得分:36)
我很惊讶这个虫子已经存在了很长时间。似乎有使用通用事件的解决方法。这是一个演示:http://jsbin.com/awenaq/3
答案 1 :(得分:9)
看起来有点像你问过这个问题所以你可能已经找到了问题的答案。如果你没有,那么bug in Webkit中有一个this SO question导致keyCode始终为0.显然,在他们修复它之前你无能为力。可悲的是,看起来并不像任何人真的在努力。这不是你想听到的答案,但它确实是现在任何人都能给你的唯一答案。
答案 2 :(得分:0)
我在Android设备上面临同样的问题,例如Sony Xperia和HTC Devices。所以我找到了替代解决方案:请参考我对此问题的回答 KeyCode Returns 0 Always
答案 3 :(得分:0)
答案 4 :(得分:0)
之所以会这样,是因为(正如其他人所说的)调用了KeyboardEvent对象(使用charCode而不是keyCode)而不是Event对象。 使用时:
function txtKeydown(e) {
console.dir(e);
console.log(e.keyCode);
}
如果要在控制台上打印0
,请尝试使用e.charCode
而不是e.keyCode
有关键盘事件的更多信息,请参阅MDN Web文档: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent
答案 5 :(得分:-2)
这不是一个错误...这个功能被淘汰,弃用,禁止,whateva'明天的名字......你不能依赖这个功能长时间工作。 ......并且存在广泛的安全风险......找到另一种方法来做你想做的事情。参考MOZILLA规格,你会看到BIG BAD RED BANNER警告要像瘟疫那样避免这种情况。 他们不会修复它,通过返回0它们可以在不改变代码的情况下有效地阻止流血,除非在一个地方它始终将keyCode切换为0。