Проблемы с wmode = opaque и проблемы с wmmode = window

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

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

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

Я хотел бы: A) Навигационные ссылки должны отображаться над флэш-приложением, чтобы они не скрывались; Б) Разрешить прокрутку внутри флеш-приложения; и C) Предотвращение прокрутки веб-страницы, если указатель мыши находится над флэш-приложением.

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


person MurderDev    schedule 29.03.2011    source источник
comment
возможный дубликат MouseWheel не работает, если опубликованный фильм имеет wmode = transparent?   -  person zzzzBov    schedule 29.03.2011
comment
wmode = transparent & wmode = opaque ведут себя так же, как и колесо мыши.   -  person zzzzBov    schedule 29.03.2011
comment
Я согласен с zzzzBov. Вы уверены, что что-то на вашей HTML-странице в коде JS не поглощает колесо мыши и не останавливает распространение до того, как оно достигнет swf?   -  person scriptocalypse    schedule 29.03.2011
comment
подождите, так вы хотите, чтобы ваше флэш-приложение прокручивалось, когда вы используете полосу прокрутки браузера?   -  person J_A_X    schedule 29.03.2011
comment
На самом деле не совсем понятно, что вы имеете в виду, говоря, что у меня вообще нет прокрутки. Можете ли вы вообще щелкнуть что-нибудь в swf? Возможно, что невидимый div перекрывает swf (частично или полностью) и полностью блокирует ввод в части swf, скрытые div. Вы абсолютно уверены, что на странице HTML ничего не мешает?   -  person scriptocalypse    schedule 29.03.2011
comment
Я могу щелкнуть и нормально использовать флэш-приложение в любом режиме. Прокрутка колесика мыши (это приложение для карт, похожее на карты Google) вообще не работает. Если он находится в оконном режиме, это так. Проблема является распространенной проблемой с wmode, когда не установлено значение window, не будет передавать события прокрутки во флэш-приложение. Ссылка zzzzBovs может быть то, что мне нужно.   -  person MurderDev    schedule 30.03.2011
comment
@scriptocalypse, это не HTML, это ошибка флэш-памяти.   -  person zzzzBov    schedule 30.03.2011
comment
@zzzzBov Спасибо за ссылку, это хорошая информация.   -  person scriptocalypse    schedule 30.03.2011


Ответы (3)


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

wmode = transparent & wmode = opaque ведут себя так же, как и колесо мыши.

заключается в том, что оба режима не фиксируют событие 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, чтобы предупредить flash о том, что произошло MOUSE_WHEEL событие.

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

person zzzzBov    schedule 29.03.2011

Исправлено отсутствие колесика мыши в приложении 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);
        }
    }
}
}
person Kevin Gallahan    schedule 29.03.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);
}
person MurderDev    schedule 29.03.2011