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

标签 javascript jquery

我正在使用 Hakim El Hattab 的 reveal.js 制作演示幻灯片。我已将文本区域添加到幻灯片中。在文本区域内,我想防止在按下某些键时调用 javascript 函数,并恢复默认的键入行为。例如,从 reveal.js 的以下代码行可以看出,当按下 p 时,将调用函数 navigatePrev()。我想阻止此函数被调用,只是希望在按下 p 时在文本区域中键入 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 事件绑定(bind)的问题在于它绑定(bind)到最后接收事件的文档(一旦为时已晚而无法阻止事件在 DOM 树中向上冒泡)。

相反,尝试在每次创建事件时将事件直接绑定(bind)到文本区域:

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

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

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

关于javascript - 禁用 textarea 中由 javascript 定义的 keydown 事件并恢复默认行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12232626/

相关文章:

javascript - 返回并从 HTML 字符串中删除元素

javascript - 在 Jquery 上解析 JSON

javascript - jquery简单覆盖闪烁问题

php - 通过浏览器上传大文件(100 GB)

javascript - 如何在jquery中使用switch case(数字范围)?

javascript - 如何在 Ajax 响应后刷新特定的 div?

javascript - 清除 ng-repeat 中的文件输入

javascript - Bootstrap 3/jquery 2 - 单击时展开切换文本区域(覆盖)

javascript - jquery/javascript合并具有相同id的数组

javascript - 使用 annotator.js 的注释无法正常工作