2013-07-26 39 views
7

JSのキープレス(keydown/keypress)をシミュレートする方法に関する多くの記事にもかかわらず、私が使用しているブラウザ(Firefox ESR 17.0。 7、クロム28.0.1500.72、IE 10)。私がテストした解決策は、here,herehereから取られました。JavaScript:テキストボックス/入力にキーイベントをシミュレート

私がしようとしているのは、テキストエリア/入力内の任意のキーストロークをシミュレートすることです。 "value"を直接変更する文字を追加/削除することはできますが、 "Up"、 "Down"、 "Home"などのキーのシミュレーションは入力できません。

documentationによれば、それは単純であるべきです。例:

var e = document.createEvent("KeyboardEvent"); 
if (e.initKeyboardEvent) { // Chrome, IE 
    e.initKeyboardEvent("keydown", true, true, document.defaultView, "Enter", 0, "", false, ""); 
} else { // FF 
    e.initKeyEvent("keydown", true, true, document.defaultView, false, false, false, false, 13, 0); 
} 
document.getElementById("text").dispatchEvent(e); 

実際に「Enter」キーダウンイベントが発生し、ハンドラがそれをキャッチできます。ただし、テキストエリアには何も影響しません。新しい行は表示されません。他のキーコードと同じです:文字は表示されず、矢印はキャレットの位置などを変更しません。

Orwellophileでコードを拡張し、http://jsfiddle.net/npF3d/4/に投稿しました。私のブラウザでは、どのボタンも、どのような状況でもテキストエリアに影響を与えません。

この問題についてお手伝いします。

答えて

6

キープレスをシミュレートしようとしているときに同じことを実行したので、これは「セキュリティ」の問題であることは間違いありません。

Q:どのようにプログラムで入力できますか?
A:たselectionStartなどselectionEndにを設定/取得だけでなく、文字を挿入するsliceよう文字列方法と組み合わせてこれらを使用しました。 (HTMLTextAreaElement参照)

Q:なぜこの種のイベントを使用しますか?
A:すべてのイベントリスナーは、あたかも実際のキーイベントであるかのように動作します。それは間違って行くん:矢印/ホーム/エンド用


削減機能はthusly DEMO

function homeKey(elm) { 
    elm.selectionEnd = 
     elm.selectionStart = 
      elm.value.lastIndexOf(
       '\n', 
       elm.selectionEnd - 1 
      ) + 1; 
} 

function endKey(elm) { 
    var pos = elm.selectionEnd, 
     i = elm.value.indexOf('\n', pos); 
    if (i === -1) i = elm.value.length; 
    elm.selectionStart = elm.selectionEnd = i; 
} 

function arrowLeft(elm) { 
    elm.selectionStart = elm.selectionEnd -= 1; 
} 

function arrowRight(elm) { 
    elm.selectionStart = elm.selectionEnd += 1; 
} 

function arrowDown(elm) { 
    var pos = elm.selectionEnd, 
     prevLine = elm.value.lastIndexOf('\n', pos), 
     nextLine = elm.value.indexOf('\n', pos + 1); 
    if (nextLine === -1) return; 
    pos = pos - prevLine; 
    elm.selectionStart = elm.selectionEnd = nextLine + pos; 
} 

function arrowUp(elm) { 
    var pos = elm.selectionEnd, 
     prevLine = elm.value.lastIndexOf('\n', pos), 
     TwoBLine = elm.value.lastIndexOf('\n', prevLine - 1); 
    if (prevLine === -1) return; 
    pos = pos - prevLine; 
    elm.selectionStart = elm.selectionEnd = TwoBLine + pos; 
} 

Qを達成することができますか?
A:行が折り返すのに十分な長さである場合、行はラップされていないかのように扱われます。ブラウザに鍵を送信

+0

OKを達成できる

は、私は、これはセキュリティ上の理由のために、意図的に行うことができるのと同じ感覚を持っていました。 Q/Aから:編集テキストは問題ではありませんが、問題は "上"、 "下"、 "家"などをシミュレートすることです。 – lexasss

+0

テキストエリアを再作成すると、 /ラップ、サイズ、スタイリングが一致する各文字のインラインノードを含むブロックノードとして入力し、次にすべての異なる矩形を計算して、最終的にどこに配置するかを見つけます。私は実装が容易であるとは想像できません。おそらくよりクリーンな方法はモノスペースフォントを使用し、前の改行文字がどこにあったかを調べ、文字を数えてください。 –

+0

ありがとうございます。しかし、google.comのように3ページ目の入力をシミュレートします。私の仮想キーボードはChrome拡張機能として実装されており、ユーザーはこのキーボードのみを使用して任意のページ上のフォームにテキストを入力して変更できるようにする必要があります。一部の機能を削除する必要がある場合は、大きな失望となります。 – lexasss

0

セレンを介して達成することができる。http://docs.seleniumhq.org/

それはプログラムすることができ、各ブラウザ用のドライバを提供します。通常はURLを開くことから始まり、スクリプトはブラウザのリモコンとして機能します。したがって、ブラウザ内でプログラマチックには不可能な、実際のキーをシミュレートするのではなく、送信することができます。あなたは、例えば、この使用http://webdriver.io/

関連する問題