繁体   English   中英

禁用textarea中由javascript定义的keydown事件并恢复默认行为

[英]Disable keydown event defined by javascript in textarea and restore default behavior

我正在使用Hakim El Hattab的reveal.js制作演示幻灯片。 我已将textarea添加到幻灯片中。 在textarea中我想阻止在按下某些键时调用javascript函数,并恢复默认的输入行为。 例如,正如您从reveal.js下面的代码行中可以看到的,当按下p时,会调用一个函数navigatePrev() 我想阻止这个函数被调用,并且只想p到textarea的时候键入p被按下。 我怎么能用jquery做到这一点? 我尝试添加以下脚本,但这没有帮助。

<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;
  }
}

keydown事件绑定的问题在于它绑定到文档,该文档接收事件LAST(一旦为了防止事件在DOM树中进一步冒泡而为时已太晚)。

相反,尝试在每次创建时将事件直接绑定到textarea:

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

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

这将在事件冒泡(传播)到正在侦听要按下的键的文档之前停止事件

你可以这样做:

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

你只需在里面添加一个if语句,如果textarea没有聚焦,那么你调用该函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM