0

にJavaScriptを使用してキー入力をシミュレートするために、私はこのトピックに関する多くの情報を発見したが、それらのどれも(もう)動作するようには思えないどのようにクロム

は、キー(上下/プレスをシミュレートすることです/クロール59のイベント(私は本当に他のブラウザを気にしない)。イベント自体をシミュレートすることは問題ではありませんが、問題は、下位互換性があり、charCode/keyCode値を含む解決策が見つからないことです。それが私に任せられていれば、私はキー/コードをチェックするために他のアプリケーションのコードを更新するでしょうが、残念ながらそれは私の責任ではありません。

var evt = new KeyboardEvent(type, {code: options.charCode, key: options.keyCode, keyCode: options.keyCode, charCode: options.keyCode, which: options.which}); 
element.dispatchEvent(evt); 

https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/KeyboardEventによれば、これは仕事と作成イベントを設定したkeyCode/charCodeは/で、それが動作しないはずです::私がこれまで試してみました何

私のコード(

new KeyboardEvent("keypress", {code: 123, key: 123, keyCode: 123, charCode: 123, which: 123}); 

出力:

01私は引用符なしで、代わりに数字の文字)を試してみました
KeyboardEvent {isTrusted: false, key: "123", code: "123", location: 0, ctrlKey: false…} 
altKey:false 
bubbles:false 
cancelBubble:false 
cancelable:false 
charCode:0 
code:"123" 
composed:false 
ctrlKey:false 
currentTarget:null 
defaultPrevented:false 
detail:0 
eventPhase:0 
isComposing:false 
isTrusted:false 
key:"123" 
keyCode:0 
location:0 
metaKey:false 
path:Array(0) 
repeat:false 
returnValue:true 
shiftKey:false 
sourceCapabilities:null 
srcElement:null 
target:null 
timeStamp:2469092.6000000006 
type:"keypress" 
view:null 
which:0 
__proto__:KeyboardEvent 

私は仕様を見て、keyCode/charCode/whichプロパティがこれ以上存在しないことに気付きました。これは標準から削除されたと信じています。より:https://w3c.github.io/uievents/#keyboardevent

これが働い明確ではない、私は非推奨の機能initKeyboardEventに見て始めたこの試みた:これはすでに有望に見えたが、私はイベントを送出したとき、これは

var evt = document.createEvent("KeyboardEvent"); 
//Chrome hack 
Object.defineProperty(evt, 'keyCode', { 
    get : function(){ 
     return this.keyCodeVal; 
    } 
}); 
Object.defineProperty(evt, 'which', { 
    get : function(){ 
     return this.keyCodeVal 
    } 
}); 
Object.defineProperty(evt, 'charCode', { 
    get : function(){ 
     return this.charCodeVal 
    } 
}); 
//initKeyBoardEvent seems to have different parameters in chrome according to MDN KeyboardEvent(sorry, can't post more than 2 links), but that did not work either 
evt.initKeyboardEvent("keypress", 
    true,//bubbles 
    true,//cancelable 
    window, 
    false,//ctrlKey, 
    false,//altKey, 
    false,//shiftKey, 
    false,//metaKey, 
    123,//keyCode, 
    123//charCode 
); 
evt.charCodeVal = 123; 
evt.keyCodeVal = 123; 

をハンドラで見ることができるイベント:

KeyboardEvent 
altKey:false 
bubbles:true 
cancelBubble:false 
cancelable:true 
charCode:0 
code:"" 
composed:false 
ctrlKey:false 
currentTarget:input#iceform:username.iceInpTxt.bookLoginTextbox 
defaultPrevented:false 
detail:0 
eventPhase:2 
isTrusted:false 
key:"" 
keyCode:0 
location:0 
metaKey:true 
path:Array[16] 
repeat:false 
returnValue:true 
shiftKey:true 
sourceCapabilities:null 
srcElement:input#iceform:username.iceInpTxt.bookLoginTextbox 
target:input#iceform:username.iceInpTxt.bookLoginTextbox 
timeStamp:9932.905000000002 
type:"keypress" 
view:Window 
which:0 
__proto__:KeyboardEvent 

これは私がついに諦めて助けを求めることになったときです。下位互換性のある方法でこれらのイベントを適切にシミュレートできる方法はありますか?

は私が最終的に問題を考え出したのjQuery OR似THINGS

+2

あなたは悲鳴を上げる**あなたに尋ねないでください - **まだjQueryで質問にタグを付けました:p –

+0

このような状況では、時々異なる方法があります。あなたの達成しようとしていることは何ですか? –

+0

Lol、あなたは間違ったタグ付けを見ていない...実際のユーザーがページ内の要素をクリックするのをシミュレートするキーイベントをシミュレートしようとしています –

答えて

0

OKを提案しないでください。コード自体は実際にはOKです(非推奨のinitKeyboardEventを持つもの)。

問題は、私がchrome拡張子のcontentscriptでこれを実行していたことです。この場合、イベントのすべてのプロパティがデフォルト値にリセットされ、イベントが発生します。私は今、まったく同じコードを含むページにスクリプトを追加しています。うまく動作します。

関連する問題