防止Firefox中的Flash处理鼠标滚轮事件

时间:2014-11-21 14:57:14

标签: javascript flash firefox javascript-events scroll

我目前正在开发一款包含一些旧版Flash页面的应用。我们最近在标题中添加了一个下拉列表,打开了一个可滚动的div。标题和下拉列表是HTML。

这是一个用于说明设置的线框。

https://wireframe.cc/27ahkk

我们遇到了一个问题,即在停留在下拉列表中时使用滚轮并没有按预期运行。

  • 下拉列表无法滚动
  • Flash内容滚动

我预计这是因为,作为Flash处理滚轮/鼠标滚轮事件的一部分,它阻止了冒泡并阻止了默认操作。我在Chrome中做了一些初步测试,发现我附加到泡沫阶段的任何事件监听器实际上都没有被调用。

我的解决方案是在捕获阶段将一个wheel / mousewheel事件监听器附加到窗口。在该处理程序中,如果鼠标悬停在我们的下拉列表上,我会调用event.stopPropagation()以防止事件到达Flash(从而允许默认操作发生)。大致是:

window.addEventListener("wheel", function (event) { 
    if ($('.dropdown-selector:hover').length != 0) {
        event.stopPropagation();
    }
}, true);

下拉菜单关闭时会移除此事件。

这在Chrome中运行良好,只要你回到被弃用的"鼠标轮"它就可以在IE中运行。事件而不是使用更现代的"轮"事件。然而,Firefox是一个不同的故事。

虽然Firefox支持" wheel"事件,似乎从浏览器向Flash发送事件的方式完全不同。

如果您将鼠标悬停在下拉列表上并使用鼠标滚轮滚动:

  1. 处理程序将触发
  2. if条件正确检测到悬停
  3. event.stopPropagation()被称为
  4. 但是,Flash内容仍会滚动
  5. Dropdown div不会滚动
  6. 更奇怪的是,如果你没有徘徊在下拉菜单上并且用鼠标滚轮滚动:

    1. 处理程序永远不会触发
    2. Flash内容滚动
    3. 这与Chrome和IE中观察到的行为不同,在鼠标悬停在Flash上​​时滚动仍然会触发处理程序,但由于鼠标未在下拉列表上,因此event.stopPropagation()永远不会被调用,因此它会被捕获到Flash将处理事件。

      这让我感到困惑,因为我在捕获阶段将监听器附加到window,因此我应该在页面上的任何其他内容之前接收事件。但是在Firefox中,似乎Flash在window之前获取事件,或者Flash完全接收到不同的事件(即使JavaScript在调试器中的断点处停止,Flash也会接收到这些事件)。 p>

      有没有人有使用Flash和Firefox的经验,并且更好地了解浏览器如何将事件发送到嵌入式Flash内容?为什么我的策略适用于所有其他浏览器,但在Firefox中却不尽如人意?在我们尝试深入研究Flash代码本身以处理解决方案之前,是否有任何可能的解决方法?

      谢谢!

1 个答案:

答案 0 :(得分:1)

所以我找到了解决这个问题的方法,虽然不完全确定它的工作原理。即使Firefox支持" wheel"和"鼠标轮"事件,将我们的听众注册到这些事件并没有产生预期的行为。但是,听#DOM; DOMMouseScroll"活动很精彩。

不确定这是由于某些浏览器特定的逻辑和/或我们的传统Flash代码如何处理滚动,但它确实有效,所以我很满意。 :)