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

时间:2011-12-19 21:16:55

标签: actionscript-3 flash mousewheel

基本上,我有在鼠标滚轮上滚动的flash内容。它工作正常,除非浏览器中有其他内容,以便启用浏览器的滚动条 - 在这种情况下,浏览器窗口和我的SWF滚动鼠标滚轮。有没有办法纠正这种行为?

此处提出类似问题:

disable mouse wheel scrolling while cursor over flex app?

引用了博客中的解决方案:

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 个答案:

答案 0 :(得分:3)

我创建了一个小型lib,可以为您处理所有事情。它在默认的flash播放器插件,Pepper闪存和MAC-OS上运行完美(据我测试)。而且您不需要将任何.js文件添加到HTML文件夹

GIhub repo

答案 1 :(得分:2)

您应该可以通过javascript完全执行此操作...

首先你需要听“wheel”,“mousewheel”和“DOMMouseScroll”。 It appears DOMMouseScroll is for Firefox only .....

其次 - 在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);

答案 2 :(得分:0)

您可能需要测试scrollmousewheel的变体才能访问Webkit事件。请参阅here

答案 3 :(得分:0)

我相信你必须在页面上用JS挂钩事件,然后防止默认,并将事件(delta)发送到你的flash。您发布的代码看起来有点设置(防止默认)但我没有看到代码挂钩DOM的位置。