防止鼠标滚轮事件被 Firefox 中的 Flash 处理
Prevent mouse wheel events from being processed by Flash in Firefox
我目前正在开发一个具有一些旧版Flash页面的应用程序。我们最近在标题中添加了一个下拉列表,该下拉列表将打开为可滚动的div。标题和下拉列表是 HTML。
这是一个线框来说明设置。
https://wireframe.cc/27ahkk
我们遇到了一个问题,即在下拉列表中悬停时使用滚轮的行为不符合预期。
- 下拉列表不滚动
- 改为滚动 Flash 内容
我预计这是因为,作为Flash处理滚轮/鼠标滚轮事件的一部分,它可以防止冒泡并防止默认操作。我在Chrome中做了一些初步测试,发现我附加到气泡阶段的任何事件侦听器实际上都没有被调用。
我的解决方案是在捕获阶段将滚轮/鼠标滚轮事件侦听器附加到窗口。在该处理程序中,如果鼠标悬停在我们的下拉列表中,我会调用event.stopPropagation()
以防止事件到达 Flash(从而允许发生默认操作)。大约:
window.addEventListener("wheel", function (event) {
if ($('.dropdown-selector:hover').length != 0) {
event.stopPropagation();
}
}, true);
下拉列表关闭时,将删除此事件。
这在 Chrome 中运行良好,只要您回退到已弃用的"鼠标滚轮"事件而不是使用更现代的"滚轮"事件,它就可以在 IE 中工作。然而,Firefox是一个不同的故事。
虽然Firefox支持"wheel"事件,但似乎事件从浏览器发送到Flash的方式完全不同。
如果将鼠标悬停在下拉菜单上并使用鼠标滚轮滚动:
- 处理程序将触发
if
条件正确检测悬停-
event.stopPropagation()
被称为 - 但是,Flash内容仍然滚动
- 下拉div 不滚动
更奇怪的是,如果您没有将鼠标悬停在下拉菜单上并用鼠标滚轮滚动:
- 处理程序从不触发
- Flash 内容滚动
中观察到的行为不同,在Chrome和IE中,将鼠标悬停在Flash上时滚动仍会触发处理程序,但由于鼠标不在下拉列表上,因此永远不会调用event.stopPropagation()
,因此它会捕获到Flash,在那里将处理事件。
这让我感到困惑,因为我在捕获阶段将侦听器附加到window
,因此我应该在页面上的任何其他内容之前接收事件。但是在Firefox中,似乎Flash甚至在window
之前就获得了事件,或者Flash完全接收了不同的事件(即使JavaScript在调试器中的断点处停止,Flash似乎也会收到这些事件)。
是否有人有使用Flash和Firefox的经验,并且对浏览器如何将事件发送到嵌入式Flash内容有更好的了解?为什么我的策略在所有其他浏览器中都有效,但在 Firefox 中却不尽如人意?在我们尝试深入研究 Flash 代码本身以处理解决方案之前,有什么可能的解决方法吗?
所以我找到了这个问题的解决方法,尽管不完全确定它为什么有效。 尽管 Firefox 同时支持"滚轮"和"鼠标滚轮"事件,但将我们的侦听器注册到这些事件并没有产生所需的行为。然而,听"DOMMouseScroll"活动效果很好。
不确定这是否是由于某些特定于浏览器的逻辑和/或我们的旧版 Flash 代码如何处理滚动,但它可以工作,所以我很满意。 :)
- 重载JS'firefox中的对象原型
- ascii输入键通过firefox中的javascript返回0
- onbeforeunload和asp:Safari和FireFox中的更新面板
- firefox中的Javascript事件范围问题
- js禁用firefox中的退格功能
- firefox中的CSS动画不起作用
- Firefox中的JavaScript事件参数
- 如何使用javascript禁用firefox中的硬件加速
- 为什么parseInt()比Firefox中的*1慢得多
- 如何在javascript中获取Android Firefox中的menuID
- 桌面firefox中的偏移值各不相同
- javascript代码,用于删除firefox中的空白,但在IE和chrome中无法正常工作
- 在 chrome 或 Firefox 中的调试控制台对.js文件运行 JSLint
- 无法将字体系列设置为“”;Arial黑色”;通过Firefox中的JavaScript
- FIREFOX中的粘性菜单错误
- 用于获取<输入类型=文件>只返回firefox中的文件名
- firefox中的setTimeout延迟
- 回溯历史后,Firefox中的Ajax调用缓存
- 使javascript在firefox中的插件javascript之后执行
- angularJS在Firefox中的糟糕性能