如何停止AS3中同时进行的浏览器和SWF鼠标滚轮滚动?

11
基本上,我有一个闪存内容,可以通过鼠标滚轮滚动。它很好用,除非浏览器中有其他内容使浏览器的滚动条启用-当出现这种情况时,浏览器窗口和我的SWF都会在鼠标滚轮上滚动。有没有办法纠正这种行为?
类似的问题在这里提出: 当光标位于flex应用程序上方时禁用鼠标滚轮滚动? 其中引用了此处博客中提到的解决方案:

http://www.spikything.com/blog/index.php/2009/11/27/stop-simultaneous-flash-browser-scrolling/

但是这种解决方案并不适用于所有浏览器!虽然它可以在一些Windows浏览器上工作,但在Mac OS X上完全不起作用-它在Firefox中注册了鼠标滚轮事件,但在Chrome和Safari中根本没有触发。

现在我知道(根据官方的Adobe InteractiveObject文档),鼠标滚轮据说仅在Windows系统上受支持,但默认情况下在Mac OS X上仍会触发该事件。这个同时滚动的错误是否是它不受支持的原因?

编辑:添加有关上述解决方案的更多信息...

请注意,上述解决方案基本上使用ExternalInterface将以下JavaScript发送到“eval”函数:

var browserScrolling;

function allowBrowserScroll(value) {
    browserScrolling = value;
}
function handle(delta) {
    if (!browserScrolling) {
        return false;
    }
    return true;
}
function wheel(event) {
    var delta = 0;
    if (!event) {
        event = window.event;
    }
    if (event.wheelDelta) {
        delta = event.wheelDelta / 120;
    } else if (event.detail) {
        delta = -event.detail / 3;
    }
    if (delta) {
        handle(delta);
    }
    if (!browserScrolling) {
        if (event.preventDefault) {
            event.preventDefault();
        }
        event.returnValue = false;
    }
}
if (window.addEventListener) {
    window.addEventListener('DOMMouseScroll', wheel, false);
}
window.onmousewheel = document.onmousewheel = wheel;
allowBrowserScroll(true);

这只猫是否至少在正确的道路上,或者是否有更好(即完全功能)的解决方案?

4个回答

3
我创建了一个小型库,可以为您处理所有内容。它在默认的Flash播放器插件、Pepper Flash和MAC-OS上都可以完美运行(据我测试)。而且您不需要将任何.js文件添加到HTML文件夹中。 GIhub repo

2
你应该能够完全通过JavaScript来完成这个任务...
首先,你需要监听"wheel"、"mousewheel"以及"DOMMouseScroll"事件。看起来DOMMouseScroll只适用于Firefox浏览器...
其次,完全使用JavaScript可能会更好一些:
// pseudo-code -- this tests for all "Objects" using not-so-standard elementFromPoint;
// You can also look for the element directly using id
    var fn = function(e) {
        var element = document.elementFromPoint(e.pageX, e.pageY);
        if (element && element.tagName === 'OBJECT') {
            e.preventDefault();
            e.stopPropagation();
        }
    }

    window.addEventListener('DOMMouseScroll', fn);
    window.addEventListener('mousewheel', fn);

0

您可能需要测试 scrollmousewheel 的变化以访问 Webkit 事件。请参见此处


0

我相信你需要在页面上用JS钩取事件,然后阻止默认行为,并将事件(delta)发送到你的Flash。你发布的代码看起来有点像在设置这个(阻止默认行为),但我没有看到代码在哪里挂接DOM。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接