3

プレゼンテーション スライドを作成するために、Hakim El Hattab による Reveal.js を使用しています。スライドにテキストエリアを追加しました。テキストエリア内で、特定のキーが押されたときに JavaScript 関数が呼び出されないようにし、入力のデフォルトの動作を復元したいと考えています。たとえば、reveal.js の以下のコード行からわかるように、pが押されると、関数navigatePrev()が呼び出されます。この関数が呼び出されないようにしたいので、が押されたpときにテキストエリアに入力したいだけです。pjqueryを使用してこれを行うにはどうすればよいですか? 次のスクリプトを追加しようとしましたが、役に立ちません。

<script>
  $(document).keydown(function (e) {
    if ($(e.target).is('textarea')) {
      e.stopPropagation();
    }
  })
</script>

Reveal.js で定義された関数は引き続き呼び出されます。return falseの代わりに使用しe.stopPropagation()ても役に立ちません。上記の jQuery 行もページの最後に含めています (reveal.js が呼び出された後)。

ありがとうございました。

Reveal.js の関連行

function onDocumentKeyDown(event) {
  // FFT: Use document.querySelector( ':focus' ) === null 
  // instead of checking contentEditable?

  // Disregard the event if the target is editable or a 
  // modifier is present
  if (event.target.contentEditable != 'inherit' || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return;

  var triggered = false;

  switch (event.keyCode) {
    // p, page up
    case 80: case 33: navigatePrev(); triggered = true; break;
    // n, page down
    case 78: case 34: navigateNext(); triggered = true; break;
    // h, left
    case 72: case 37: navigateLeft(); triggered = true; break;
    // l, right
    case 76: case 39: navigateRight(); triggered = true; break;
    // k, up
    case 75: case 38: navigateUp(); triggered = true; break;
    // j, down
    case 74: case 40: navigateDown(); triggered = true; break;
    // home
    case 36: navigateTo(0); triggered = true; break;
    // end
    case 35: navigateTo(Number.MAX_VALUE); triggered = true; break;
    // space
    case 32: overviewIsActive() ? deactivateOverview() : navigateNext(); triggered = true; break;
    // return
    case 13: if (overviewIsActive()) { deactivateOverview(); triggered = true; } break;
  }
}
4

2 に答える 2

5

keydown イベント バインディングの問題は、イベントを LAST 受け取るドキュメントにバインドすることです (イベントが DOM ツリーをさらに上にバブルするのを防ぐには遅すぎる場合)。

代わりに、イベントが作成されるたびにテキストエリアに直接バインドしてみてください。

// create text area & append to slide container
createTextAreaOnSlideContainer();

// bind an event handler to the element
$('textarea.slideTextArea').keydown( function(e) {
    e.stopPropagation();
});

これにより、キーが押されるのをリッスンしているドキュメントにバブル (伝播) する前に、イベントが停止します。

于 2012-09-02T01:27:25.030 に答える
-1

あなたはこれを行うことができます:

$(document).keydown(function(e){
 if(!$('#textarea').is(':focus')){
    yourfunction();
    }
});

内部にステートメントを追加するだけでif、テキストエリアがフォーカスされていない場合は関数を呼び出します。

于 2012-09-02T01:38:34.650 に答える