我目前正在开发一款包含一些旧版Flash页面的应用。我们最近在标题中添加了一个下拉列表,打开了一个可滚动的div。标题和下拉列表是HTML。
这是一个用于说明设置的线框。
我们遇到了一个问题,即在停留在下拉列表中时使用滚轮并没有按预期运行。
我预计这是因为,作为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发送事件的方式完全不同。
如果您将鼠标悬停在下拉列表上并使用鼠标滚轮滚动:
if
条件正确检测到悬停event.stopPropagation()
被称为更奇怪的是,如果你没有徘徊在下拉菜单上并且用鼠标滚轮滚动:
这与Chrome和IE中观察到的行为不同,在鼠标悬停在Flash上时滚动仍然会触发处理程序,但由于鼠标未在下拉列表上,因此event.stopPropagation()
永远不会被调用,因此它会被捕获到Flash将处理事件。
这让我感到困惑,因为我在捕获阶段将监听器附加到window
,因此我应该在页面上的任何其他内容之前接收事件。但是在Firefox中,似乎Flash在window
之前获取事件,或者Flash完全接收到不同的事件(即使JavaScript在调试器中的断点处停止,Flash也会接收到这些事件)。 p>
有没有人有使用Flash和Firefox的经验,并且更好地了解浏览器如何将事件发送到嵌入式Flash内容?为什么我的策略适用于所有其他浏览器,但在Firefox中却不尽如人意?在我们尝试深入研究Flash代码本身以处理解决方案之前,是否有任何可能的解决方法?
谢谢!
答案 0 :(得分:1)
所以我找到了解决这个问题的方法,虽然不完全确定它的工作原理。即使Firefox支持" wheel"和"鼠标轮"事件,将我们的听众注册到这些事件并没有产生预期的行为。但是,听#DOM; DOMMouseScroll"活动很精彩。
不确定这是由于某些浏览器特定的逻辑和/或我们的传统Flash代码如何处理滚动,但它确实有效,所以我很满意。 :)