Javascript アプリケーション用のオンスクリーン キーボードを実装しています。テキストは textarea-Element に表示されます。テキスト イベントの作成には問題はありませんが、Backspace などの非テキスト イベントを作成できないと感じています。サンプルコードは次のとおりです。
<html> <頭> <title>Textarea イベントのテスト</title> <script type="text/javascript"> 関数ログ(テキスト) { var elem = document.getElementById("ログ"); if (要素) { elem.innerHTML += "<br/>" + テキスト; } } 関数 logEvent(e) { log("Type: " + e.type + ", which: " + e.which + ", keyCode: " + e.keyCode + ", charCode: " + e.charCode + ", keyIdentifier: " + e.keyIdentifier + "、データ: " + e.data); } 関数 logClear() { var elem = document.getElementById("ログ"); if (要素) { elem.innerHTML = ""; } } 関数 sendBackEvent() { var textarea = document.getElementById("textarea"); if(!テキストエリア) { 戻る; } var ke1 = document.createEvent("KeyboardEvent"); ke1.initKeyboardEvent("keydown", true, true, window, "U+0008", 0, ""); // U+0008 --> バックスペース // "keyCode" と "which" を設定する方法は? // 1. ke1.keyCode = 8; "writable: false" のため無視されます // 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.dispatchEvent(ke1); var ke2 = document.createEvent("KeyboardEvent"); ke2.initKeyboardEvent("keyup", true, true, window, "U+0008", 0, ""); // U+0008 --> バックスペース // 上記と同じ質問 textarea.dispatchEvent(ke2); } 関数init() { var textarea = document.getElementById("textarea"); if(!テキストエリア) { 戻る; } textarea.addEventListener("keydown", logEvent, false); textarea.addEventListener("keypress", logEvent, false); textarea.addEventListener("keyup", logEvent, false); textarea.addEventListener ("textInput", logEvent, false); } </script> </head> <body onload="init()"> <textarea id="textarea" name="text" cols="100" rows="20"></textarea><br/><br/> <button onclick="sendBackEvent()">BackEvent を送信</button> <button onclick="logClear()">ログをクリア</button><br/> <div id="ログ"></div> </body> </html>
ここで興味深い関数はsendBackEvent()
. 物理キーボードの Backspace ボタンを押すなど、まったく同じイベントを取得しようとしましたが、成功しませんでした。
Webkit-Bugがあることは知っていますが、これを機能させる別の方法があることを願っています。誰かが同じ問題を抱えていますか?それは解決できますか?どのように?ここで提案されているソリューション( new を呼び出すKeyboardEvent(...)
) は機能しません。KeyboardEvent コンストラクターを直接呼び出すと、次の例外が発生するためです。
例外: TypeError: '[object KeyboardEventConstructor]' はコンストラクターではありません ('new KeyboardEvent(...)' を評価しています)
もうアイデアはありません。