我正在为 Javascript 应用程序实现屏幕键盘。文本应出现在 textarea-Element 中。我创建文本事件没有问题,但感觉无法创建非文本事件,例如退格键。这是一些示例代码:
<html>
<头部>
<title>测试文本区域事件</title>
<script type="text/javascript">
功能日志(文本){
var elem = document.getElementById("log");
如果(元素){
elem.innerHTML += "<br/>" + 文本;
}
}
功能日志事件(e){
log("类型:" + e.type + ",其中:" + e.which + ",keyCode:" + e.keyCode + ",charCode:" + e.charCode + ",keyIdentifier:" + e.keyIdentifier + ", 数据: " + e.data);
}
功能日志清除(){
var elem = document.getElementById("log");
如果(元素){
elem.innerHTML = "";
}
}
函数 sendBackEvent() {
var textarea = document.getElementById("textarea");
如果(!文本区域){
返回;
}
var ke1 = document.createEvent("KeyboardEvent");
ke1.initKeyboardEvent("keydown", true, true, window, "U+0008", 0, ""); // U+0008 --> 退格
// 如何设置“keyCode”和“which”?
// 1. ke1.keyCode = 8; 由于“可写:假”而被忽略
// 2. 删除 ke1.keyCode 也会被忽略
// 和 Object.defineProperty(KeyboardEvent.prototype, "keyCode", ... 不管...);
// 由于 "configurable: false" 将导致异常
// 3. 生成更通用的事件(例如“var e = document.createEvent("Events");")
// 并设置所有必要的道具(例如 "e.initEvent("keydown", true, true);e.keyCode=8;e.which=8;")
// 会起作用,但 textarea 会忽略事件
textarea.dispatchEvent(ke1);
var ke2 = document.createEvent("KeyboardEvent");
ke2.initKeyboardEvent("keyup", true, true, window, "U+0008", 0, ""); // U+0008 --> 退格
// 和上面一样的问题
textarea.dispatchEvent(ke2);
}
函数初始化(){
var textarea = document.getElementById("textarea");
如果(!文本区域){
返回;
}
textarea.addEventListener("keydown", logEvent, false);
textarea.addEventListener("keypress", logEvent, false);
textarea.addEventListener("keyup", logEvent, false);
textarea.addEventListener("textInput", logEvent, false);
}
</脚本>
</head>
<body onload="init()">
<textarea id="textarea" name="text" cols="100" rows="20"></textarea><br/><br/>
<button onclick="sendBackEvent()">发送返回事件</button>
<button onclick="logClear()">清除日志</button><br/>
<div id="log"></div>
</正文>
</html>
这里有趣的功能是sendBackEvent(). 我努力获得完全相同的事件,例如按下物理键盘上的退格键,但没有成功。
我知道有一个Webkit-Bug,但希望有其他方法可以让它工作。有没有人有同样的问题?能解决吗?如何?此处建议的解决方案(调用 new KeyboardEvent(...))不起作用,因为直接调用 KeyboardEvent 构造函数会导致以下异常:
异常:TypeError:'[object KeyboardEventConstructor]' 不是构造函数(评估'new KeyboardEvent(...)')
我没有更多的想法了。