返回焦点,contenteditable 错过按键事件

Returning focus, contenteditable misses keypress event

故事

在自定义内容编辑器组件 (contenteditable div) 中,我需要在其中阻止某些字符输入。如果用户尝试输入受限字符,则会显示一个 bootstrap 模式对话框来解释该限制(“不允许您使用 'x')并且该事件将被阻止 (preventDefault)。关闭对话框后,焦点返回到 contenteditable 并且可以恢复输入。

Issue/Bug?

关闭对话框后,焦点确实返回到 contenteditable。但是,第一个按键事件不会绕过按键事件侦听器在 contenteditable 上触发 keypress

我尝试手动设置焦点并在 contenteditable 上明确设置文档选择,但没有成功。我已经尝试过 jquery 和纯 js.

知道为什么第一个事件会绕过按键侦听器吗?

插图

JSFiddle here,限制“.”的示例输入:

<div id="testMe" contenteditable="true" class="form-control"></div>

<div id="myModal" class="modal fade">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-body">
          <p> You are not allowed to use this character.</p>
          <p> Press OK to dismiss.</p>
      </div>
      <div class="modal-footer">
        <button id="closeAlert" type="button" class="btn btn-danger">OK</button>
      </div>
    </div>
  </div>
</div>


$("#testMe").keypress(function(event) {
    console.log("key pressed");
    if (String.fromCharCode(event.which) == ".") {
        event.preventDefault();
        $('#myModal').modal('show');
    }
});


$("#closeAlert").click(function() {
    $('#myModal').modal('hide');
});
  1. 在 contenteditable 中单击
  2. 按“。”字符(没有输入出现,"keypress" 消息打印到控制台)。
  3. 关闭对话框
  4. 按“。”字符再次出现(输入出现,控制台日志中没有出现按键消息)。

原来问题出在元素的焦点后移。添加

$("#testMe").focus();

隐藏模式后修复它。

我最初使用 bootbox 库来显示模式。由于不明原因,在对话框关闭回调后立即设置焦点不起作用。