javascript - Mousedown 事件处理程序会干扰按键处理程序

标签 javascript dom-events

我的应用程序一直表现不佳。在删除越来越多的代码后,我设法找到了问题的核心,但这对我来说毫无意义。

一点背景。我的网络编辑器应用程序对击键使用react,例如当按下 Alt 时,调整大小的处理程序将被隐藏。它还对拖动、调整大小、删除、绘制选择框等鼠标操作使用react。在尝试事件处理程序并防止默认行为时(我不希望 Alt 将焦点更改为浏览器菜单,鼠标都无法选择文本),我发现了一个奇怪的事情。

当我为 keyupkeydown 创建事件处理程序(其中包含 preventDefault())时,它工作正常。但是,当我为 mousedown 添加处理程序时,它也可以工作,但以前的处理程序停止工作。如果我从 mousedown 处理程序中删除 preventDefault(),则一切正常。

这是我的 JS 代码,被精简到最少(或者更确切地说,为了验证问题不在其他地方而创建):

// it works fine with these events
var events = ['keyup', 'keydown'];

// but when mousedown is added, its preventDefault() method somehow breaks keydown and keyup
//var events = ['keyup', 'keydown', 'mousedown'];

var log = document.getElementById('log');

var handler = function(e) {
  log.innerHTML = e.type + '<br>' + log.innerHTML;
  e.preventDefault();
}

for (var i = 0; i < events.length; i++) {
  window.addEventListener(events[i], handler);
}

参见 jsfiddle here .

为什么 mousedown 处理程序中的 preventDefault() 方法会干扰按键事件?

在 Chrome 和 Firefox 中测试。

最佳答案

新:

我只需要进一步测试它。看来 this.focus() 与我的 documen.getElementById().focus()window.focus() 一样有效最后更新。最佳实践 (IMO) 将使用 this,因为它是对单击对象的通用引用。

最新旧版: New Demo

终于!我做错的是使用document对象,而我应该使用window。这次在任何测试的浏览器(甚至 IE11)中控制台都没有错误。所以代码应该如下所示:

var handler = function(e) {
    log.innerHTML = e.type + '<br>' + log.innerHTML;
    document.focus();
    e.preventDefault();
}

旧2:这次我只是进一步测试了这一点。似乎 mousedown 上的 e.preventDefault() 不会破坏其他事件,并且按其应有的方式工作:防止默认操作(以及其他操作)设置 focus 到 DOM 元素上。我在本地 html 文件上尝试了相同的代码,它工作得很好。您需要做的就是自行将焦点设置在必须读取这些事件的对象上。

编辑: DEMOhandler函数的代码:

var handler = function(e) {
    log.innerHTML = e.type + '<br>' + log.innerHTML;
    document.focus();
    e.preventDefault();
}

旧 1: 这是因为 mousedown 事件会一直持续到您“放手”为止(尝试相同的代码,但使用 mouseup 而不是 鼠标按下)。它只是不像 keydown 那样工作,其中事件被发送、结束,然后重复此事件,直到您停止按键。

关于javascript - Mousedown 事件处理程序会干扰按键处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24632013/

相关文章:

javascript - 无法在 Windows 8 应用程序中获取提要

javascript - 仅获取 HTML 元素的第一类

javascript - 如何使用事件监听器将 &lt;textarea&gt; 的内容复制到变量中?

javascript - 为什么 Event Object 中存在细微的跨浏览器差异

javascript - 对于不同的屏幕,页脚未正确定位在页面底部

javascript - Kendo 网格列中的格式化 HTML 数据

javascript - 如何复制另一个元素的onclick函数

internet-explorer - 如何在 Internet Explorer 中监视浏览器事件?

JavaScript - 找出一个数字均匀地进入另一个数字的次数

javascript - HTML5 - 文件名在媒体播放器中不起作用