Проблемы с wmode = "opaque" и проблемы с wmmode = "window" - PullRequest
2 голосов
/ 29 марта 2011

Хорошо, так что сначала у меня было 2 проблемы с wmode по умолчанию "окна".Навигационные меню моей веб-страницы будут находиться в моем приложении flex / flash.Другая проблема заключалась в том, что при прокрутке во флэш-приложении прокручивалась вся страница.

Я изменил wmode на «непрозрачный», и это устранило проблему с навигационными меню, и теперь они отображаются над приложением flash.Это здорово, но теперь у меня вообще нет прокрутки во флэш-приложении.

Я понимаю, что это большая проблема, но я не могу найти какие-либо решения для решения обеих (на самом деле 2.5 проблем) этих проблем.

Я бы хотел А) Естьнавигационные ссылки отображаются над приложением flash, поэтому они не скрыты;Б) Разрешить прокрутку в приложении Flash;и C) Запретить прокрутку веб-страницы, если мышь находится над приложением flash.

Если у вас, ребята, есть какие-нибудь идеи, которые были бы фантастическими.:) Заранее спасибо.

Ответы [ 3 ]

5 голосов
/ 30 марта 2011

Что я имел в виду, когда писал:

wmode = прозрачный & wmode = непрозрачный ведет себя так же, как колесико мыши.

заключается в том, что оба режима не фиксируют событие MOUSE_WHEEL во флэш-памяти в большинстве браузеров (я считаю, что IE - единственный браузер, который правильно фиксирует событие MOUSE_WHEEL).

Решение заключается в прослушивании события MOUSE_WHEEL через JavaScript:

//ie handles wmode=transparent correctly
//every other browser uses addEventListener
if ( !document.attachEvent )
{
  //console.log('attached');
  window.addEventListener('DOMMouseScroll', scrollListener, false);
  window.addEventListener('mousewheel', scrollListener, false);
}

scrollListener( e )
{
  var delta
  if ( e.wheelDelta )
  {
    delta = e.wheelDelta / 40;
  }
  else if ( e.detail )
  {
    delta = -e.detail;
  }
  //do stuff with delta
}

Затем вам нужно будет использовать ExternalInterface.addCallback, чтобы настроить обратный вызов для JS, чтобы предупредить о том, что произошло событие MOUSE_WHEEL.

wmode=transparent & wmode=opaque также имеют проблемы с другими событиями мыши.

1 голос
/ 30 марта 2011

Я смог решить все три проблемы после этой хорошей ссылки от zzzzBov.Это позволяет мне передавать прокрутку мыши во флэш-приложение, делая это, только если мышь находится над флэш-приложением.Это также позволяет моему флэш-приложению оставаться в «непрозрачном» режиме, чтобы оно не было выше других элементов HTML на странице.

Пример этого можно найти здесь

Javascript

$(document).ready(function () {
        $('#MapSWFDiv').bind('mousewheel', function (event) {
            HandleMouseWheel(event);

            return false;
        });

        //Firefox
        $('#MapSWFDiv').bind('DOMMouseScroll', function (event) {
            HandleMouseWheel(event);

            return false;
        });
    });

    function HandleMouseWheel(event) {
        var app = GetMapSWF();
        if (app) {
            var delta = event.wheelDelta ? event.wheelDelta : event.detail;

            var o = { x: event.clientX, y: event.clientY,
                delta: delta,
                ctrlKey: event.ctrlKey, altKey: event.altKey,
                shiftKey: event.shiftKey
            }

            app.HandleMouseWheel(o);
        }
    }

Flex

protected function appComplete():void  {
    ExternalInterface.addCallback("HandleMouseWheel", HandleMouseWheel);
}

//This function passes the event to my map object. You could actually pass 
//it to any objects in the app that you would like. Also note that I am 
//getting the mouse coords from the flex app vs the actual browser. This keeps 
//everything local.
public function HandleMouseWheel(event:Object): void {
    var mEvent:MouseEvent = new MouseEvent(MouseEvent.MOUSE_WHEEL, true, false,                     
        this.contentMouseX, this.contentMouseY, map, 
        event.ctrlKey, event.altKey, event.shiftKey, 
        false, -Number(event.delta));
    map.dispatchEvent(mEvent);
}
1 голос
/ 30 марта 2011

Исправлено отсутствие MouseWheel в приложении Flex, когда wmode = "opaque" (на самом деле это работает в IE, но не в Firefox или Chrome, возможно, не в Safari или Opera).Это также исправляет различные скорости прокрутки MouseWheel между Firefox и всем остальным.

Добавьте этот JavaScript в свою оболочку:.

        if(window.addEventListener) {
            var eventType = (navigator.userAgent.indexOf('Firefox') !=-1) ? "DOMMouseScroll" : "mousewheel";            
            window.addEventListener(eventType, handleWheel, false);
        }

        function handleWheel(event) {
            var app = document.getElementById("YOUR_APPLICATION");
            var edelta = (navigator.userAgent.indexOf('Firefox') !=-1) ? -event.detail : event.wheelDelta/40;                                   
            var o = {x: event.screenX, y: event.screenY, 
                delta: edelta,
                ctrlKey: event.ctrlKey, altKey: event.altKey, 
                shiftKey: event.shiftKey}

            app.handleWheel(o);
        }

И перетащите этот класс поддержки в ваш основной файл MXML (Объявления дляFlex4):.

package {
import flash.display.InteractiveObject;
import flash.display.Shape;
import flash.display.Stage;
import flash.events.MouseEvent;
import flash.external.ExternalInterface;
import flash.geom.Point;

import mx.core.FlexGlobals;
import mx.core.UIComponent;
import mx.events.FlexEvent;

public class MouseWheelSupport {

    //--------------------------------------
    //   Constructor 
    //--------------------------------------

    public function MouseWheelSupport() {
        FlexGlobals.topLevelApplication.addEventListener(FlexEvent.APPLICATION_COMPLETE, attachMouseWheelHandler);
    }

    //------------------------------------------------------------------------------
    //
    //   Functions  
    //
    //------------------------------------------------------------------------------

    //--------------------------------------
    //   Private 
    //--------------------------------------

    private function attachMouseWheelHandler(event : FlexEvent) : void {
        ExternalInterface.addCallback("handleWheel", handleWheel);
    }

    private function handleWheel(event : Object) : void {
        var obj : InteractiveObject = null;
        var applicationStage : Stage = FlexGlobals.topLevelApplication.stage as Stage;

        var mousePoint : Point = new Point(applicationStage.mouseX, applicationStage.mouseY);
        var objects : Array = applicationStage.getObjectsUnderPoint(mousePoint);

        for (var i : int = objects.length - 1; i >= 0; i--) {
            if (objects[i] is InteractiveObject) {
                obj = objects[i] as InteractiveObject;
                break;
            }
            else {
                if (objects[i] is Shape && (objects[i] as Shape).parent) {
                    obj = (objects[i] as Shape).parent;
                    break;
                }
            }
        }

        if (obj) {
            var mEvent : MouseEvent = new MouseEvent(MouseEvent.MOUSE_WHEEL, true, false,
                                                     mousePoint.x, mousePoint.y, obj,
                                                     event.ctrlKey, event.altKey, event.shiftKey,
                                                     false, Number(event.delta));
            obj.dispatchEvent(mEvent);
        }
    }
}
}
...