2016-05-10 4 views
0

私はいくつかのコンテキストから始めます:私は、画面にテキストを表示し、keypressイベントを使用して入力するとwpmを追跡する小さなタイプのアプリケーションを書きました。退屈な状態から私はちょっと試してみたいと思っていました。隠しコマンド(短い矢印キーを使ってkontraコードを短縮する)を入力すると、自動入力する方法がありました。だから私は、私が繰り返す文字の配列を持っているし、私の各ループのkeypressイベントを以下に示すようにシミュレートしようとしている。jQueryのトリガーイベントループ内で複数回

私の問題は、自分のイベントが1回だけトリガしてから再度トリガしないように見えることです。 setTimeout関数は、処理が早すぎる場合に備えて、ループを遅くする初期の試みでした。その後、私はほとんど純粋なjavascript関数(typeIt())関数を実装してキーボードイベントを偽装しました。それは以下の通りです。

function typeIt(character) { 
    var keyboardEvent = document.createEvent("KeyboardEvent"); 
    var initMethod = typeof keyboardEvent.initKeyboardEvent !== 'undefined' ? "initKeyboardEvent" : "initKeyEvent"; 
    console.log(String.fromCharCode(character.charCodeAt(0)) + ' ' + (character.charCodeAt(0))); 

    keyboardEvent[initMethod](
        "keypress", // event type : keydown, keyup, keypress 
         true, // bubbles 
         true, // cancelable 
         window, // viewArg: should be window 
         false, // ctrlKeyArg 
         false, // altKeyArg 
         false, // shiftKeyArg 
         false, // metaKeyArg 
         0, // keyCodeArg 
         character.charCodeAt(0) // charCodeArgs 
); 
    document.dispatchEvent(keyboardEvent); 
} 

これも一度入力しましたが、間違った文字を入力しているようです。だから私はjQueryトリガを働かせようとすることに戻り、それに固執しました。私はそれを最初の手紙をタイプすることができますが、その後それは完全に発砲を停止するように見えます。私はイベントのトリガーをリセットする可能性があるのか​​どうか疑問に思っていました。リセットされずにループ内で1回しか起動できない場合、またはそれがここでも問題になっている場合です。

これが何が起こっているのかを見たいと思っているのなら、私はここでモックアップしています(私が実際に取り組んでいることはもうちょっと洗練されたC#アプリですバックエンド):私はシンプルjQueryクリックイベントでこの問題を持っていた

+0

あなたは '$(文書).one'を使用してイベントリスナーを設定している、[.one](HTTP ://api.jquery.com/one/)は、イベントリスナーを一度だけ使用します。その後、再び呼び出されることはありません。 '.on'を常に使用したい場合は –

+0

@PatrickEvans私はそれを好奇心から.on()に変更しましたが、いくつかの問題がありました。最初の問題は以前と同じ結果だった、最初の文字は正しく入力され、それ以外は何も起こらなかった。 2番目は完全にロックされたページでした。そして第3に、私がon()の代わりに()を使うと、私の元のkeypressイベントが2回発生するので、元のアプリケーションで1つ()を使用しました。 Codepenでそれを変更してから入力すると、そこに問題が表示されます。 – jiggawagga

+0

codepenでシミュレートされたkeypressイベントを使用しようとしていません。しかし、何回呼び出すにしても、「トリガー」を呼び出すとこのイベントがトリガーされます(こちらはデモです)(https://jsfiddle.net/tu4x5bv2/)。だからあなたのコードの他の部分でやっていることは、イベントリスナーをオフにするか、 'trigger'を正しく呼び出さないことです –

答えて

0

を参照してください。

$('#out').trigger({ type: 'keypress', which: value.charCodeAt(0)}); 

は基本的にそれを受け取ることになっている要素にイベントをトリガ:これに

jQuery.event.trigger({ type: 'keypress', which: value.charCodeAt(0) }); 

:私は仕事にそれを得るために変更しなければならなかった唯一のことは、これを変更しました。私はあまりよくjQueryに精通していないので、これはあなたが後にしている解決策ではないかもしれません。しかし、それは私のために働いた。

フィドルのための完全なJS:

var _arrToCopy = Array.prototype.slice.call("lorem ipsum"); 
var time = 0; 
$('#out').keypress(function(e){ 
    $(this).text($(this).text() + String.fromCharCode(e.which)); 
}); 

$.each(_arrToCopy, function (index, value) { 
    setTimeout(function() { 
    console.log(value); 
    $('#out').trigger({ type: 'keypress', which: value.charCodeAt(0)}); 
    }, time); 
    time += 500; 
}); 

そしてHTML:

<p id="out"> 
関連する問題