Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 防止Firefox中的Flash处理鼠标滚轮事件_Javascript_Firefox_Flash_Scroll_Dom Events - Fatal编程技术网

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

Javascript 防止Firefox中的Flash处理鼠标滚轮事件,javascript,firefox,flash,scroll,dom-events,Javascript,Firefox,Flash,Scroll,Dom Events,我目前正在开发一个应用程序,它有一些遗留的Flash页面。我们最近在标题中添加了一个下拉列表,它将打开一个可滚动的div。标题和下拉列表是HTML 这里有一个线框来说明设置 我们遇到了一个问题,即在下拉菜单中悬停时使用滚轮的行为不符合要求 下拉列表不会滚动 Flash内容会滚动 我认为这是因为,作为Flash处理wheel/mousewheel事件的一部分,它可以防止冒泡和默认操作。我在Chrome中做了一些初始测试,发现我附加到bubble阶段的任何事件侦听器实际上都没有被调用 我的解决

我目前正在开发一个应用程序,它有一些遗留的Flash页面。我们最近在标题中添加了一个下拉列表,它将打开一个可滚动的div。标题和下拉列表是HTML

这里有一个线框来说明设置

我们遇到了一个问题,即在下拉菜单中悬停时使用滚轮的行为不符合要求

  • 下拉列表不会滚动
  • Flash内容会滚动
我认为这是因为,作为Flash处理wheel/mousewheel事件的一部分,它可以防止冒泡和默认操作。我在Chrome中做了一些初始测试,发现我附加到bubble阶段的任何事件侦听器实际上都没有被调用

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

window.addEventListener("wheel", function (event) { 
    if ($('.dropdown-selector:hover').length != 0) {
        event.stopPropagation();
    }
}, true);
下拉列表关闭时,此事件将被删除

这在Chrome中运行得很好,在IE中也可以运行,只要您回到不推荐使用的“mousewheel”事件,而不是使用更现代的“wheel”事件。然而,Firefox则是另一回事

虽然Firefox支持“轮子”事件,但从浏览器发送事件到Flash的方式似乎完全不同

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

  • 处理者将开火
  • if
    条件正确检测到悬停
  • 调用
    event.stopPropagation()
  • 但是,Flash内容仍然会滚动
  • 下拉列表div不滚动
  • 更奇怪的是,如果您没有将鼠标悬停在下拉列表上并用鼠标滚轮滚动:

  • 处理者从不开火
  • Flash内容卷轴
  • 这与在Chrome和IE中观察到的行为不同,在Chrome和IE中,鼠标悬停在Flash上时滚动仍会触发处理程序,但由于鼠标不在下拉菜单上,因此不会调用
    事件。stopPropagation()
    ,因此它会捕获到Flash中处理事件的位置

    这让我很困惑,因为我在捕获阶段将侦听器附加到了
    窗口
    ,所以我应该在页面上的任何其他内容之前接收事件。但在Firefox中,Flash似乎在
    窗口
    之前就获得了事件,或者Flash收到了一个完全不同的事件(即使JavaScript在调试器的断点上停止,Flash似乎也会收到这些事件)


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

    因此,我找到了解决此问题的方法,尽管不完全确定它为什么有效。尽管Firefox同时支持“wheel”和“mousewheel”事件,但将侦听器注册到这些事件并不能产生预期的行为。然而,聆听“DOMMouseScroll”活动效果很好

    不确定这是否是由于某些特定于浏览器的逻辑和/或我们的旧式Flash代码如何处理滚动,但它的工作原理让我很满意。:)