2017-06-15 14 views
0

jQueryプラグインを使用して選択ボックスを置き換えています。Enterキーを押したときにシフトキーを押したまま項目を選択すると、隠し入力を追加します。私の問題は、select Plugin Listenerがkeydown listenerの前に起こっていることです。私の最初のon()を私の2番目のon()の前に実行させる方法はありますか?シフトキーが押されている場合は、2番目のon()の内部をチェックする方法はありますか?私がon()の中に入れた場合、e.shiftKeyは私にundefinedを与えます。アイデアありがとう!機能の実行中にシフトキーが押されていないか確認してください。

var shiftHeld = false; 
$(document).on('keydown', function(e) { 
    if(e.which == 13) { 
     shiftHeld = e.shiftKey; 
    } 
}); 

$menu = $('#menu').select2(); 

$menu.on('select2:close', function (e) { 
    if(shiftHeld) { $('#form').append('<input type="hidden" name="shift" value="1" />'); } 
    form.submit(); 
}); 
+0

私はあなたがshiftHeldをfalseに設定できるように、キーアップハンドラが必要だと思います。あなたの現在のロジックでは、shiftHeldは一度押されるとすぐに真です。そのままで – Huangism

+0

@Huangismありがとう!以下の投稿に私のコメントを参照してください。 – SeaBass

答えて

1

JavaScriptでイベントモデルがフェーズをキャプチャフォーカスのある要素(にドキュメント要素から下降)、再び上昇する(発泡段階)。

document ->  element -> document 
------- CAPTURE ------|----- BUBBLING ------ 

通常、バブリングフェーズ(ターゲット要素 - >文書)でイベントをキャプチャします。 What is event bubbling and capturing?https://www.quirksmode.org/js/events_order.html

ただし、リスナーをキャプチャフェーズに設定することもできます。これにより、子要素がイベントに気付く前に親要素の子イベントに反応することができます。

そうするために:イベントは、あなたの要素に到着する前に

function handleShift(e) { shiftHeld = e.shiftKey } 
document.addEventListener("keydown", handleShift, true); 
document.addEventListener("keyup", handleShift, true); 

このハンドラが呼び出されます。キャプチャフェーズでハンドラを設定することを示すために、最後のパラメータ "true"に注意してください。

+0

素晴らしい!それは前にトリガー!ありがとう! keydown/keyupでjQueryを使ってキャプチャフェーズを設定することはできますか? – SeaBass

+0

hmm私は確かに分かりませんが、古いバージョンでは、おそらく今は可能ですが、私はしばらくjqueryを使用していません – rupps

0

shiftHeld値が更新されるので、シフトがリリースされたときにちょうどあなたのシフトチェックにからkeyup追加:

var shiftHeld = false; 
$(document).on('keydown keyup', function(e) { 
    if(e.which == 13) { 
     shiftHeld = e.shiftKey; 
    } 
}); 

function closeHandler() { 
    if(shiftHeld) { $('#form').append('<input type="hidden" name="shift" value="1" />'); } 
    form.submit(); 
} 

$menu.on('select2:close', setTimeout("closeHandler()",100)); 
+0

ありがとう!それでも 'if(shiftHeld)'の中には入りません。問題は、2番目の 'on()'が最初のものの前に終了しているということです。 – SeaBass

+0

私は見て、もう一度私を見てください。 – mjw

+0

上記を試してください。これでもうまくいかない場合は、アラートを追加できますか(shiftHeld)。 before(shiftHeld)closeHandler()内のlinと表示されている値を教えてください。 – mjw

関連する問題