2009-04-29 2 views
2

Существует ли какое-либо обходное решение проблемы с Adobe Flash, где Flash Movie не получает событие mouse up, если мышь вытаскивается за пределы фильма?Есть ли обходной путь к ошибке Flash, где выбор не останавливается?

EDIT: Эта проблема, кажется, затрагивает Firefox только

См: http://bugs.adobe.com/jira/browse/FP-234

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

Многие предложили использовать ActinScript для прослушивания события MOUSE_LEAVE, но есть две проблемы. Во-первых, я использую AS2, а не AS3, и, во-вторых, кажется, что MOUSE_LEAVE не срабатывает, если мышь удерживается, когда он покидает сцену.

EDIT 2: «грязный хак» Джорджа Форинцы в основном работал на меня в течение нескольких месяцев ... но по состоянию на 8/24/10 я теперь вижу, что Adobe пометила эту проблему как окончательную, наконец!

ответ

2

Я могу себе представить, в чем проблема, но я не могу воспроизвести в простом контексте.

Вот «грязный хак» ... как стиль, основанный на MOUSE_LEAVE.

input.onKillFocus = function(newFocus:Object) { 
    trace(this._name+" lost focus. New focus changed to: "+newFocus._name); 
    delete input._parent.onEnterFrame; 
}; 
input.onSetFocus = function(oldFocus:Object) { 
    trace(this._name+" gained focus. Old focus changed from: "+oldFocus._name); 
    input._parent.onEnterFrame = trackMouse; 
} 

function trackMouse():Void{ 
    if(input._xmouse < 0 || input._xmouse > (input._x + input._width)) onMouseOut(); 
    if(input._ymouse < 0 || input._ymouse > (input._y + input._height)) onMouseOut(); 
} 

function onMouseOut():Void{ 
    Selection.setFocus(dummyBtn); 
} 

Предполагаемый ввод - выбираемое текстовое поле. Если текстовое поле сфокусировано, я добавляю прослушиватель enterFrame, чтобы проверить, находится ли мышь над или вне текстового поля (с использованием input._xmouse, противоположного _xmouse, который является глобальным). Если мышь находится за пределами текстовой области, я меняю фокус на фиктивный объект (кнопка, называемая dummyBtn). Это работает, если вы находитесь в Firefox, и у вас есть выбор и выпуск за пределами swf, потому что как только вы покинете текстовое поле, фокус переключится на dummyBtn.

Я признаю, что это немного грубо, если вам все еще нужен выбор или что-то еще, так что дайте мне знать.

Goodluck.

+0

Я считаю, что Selection.setFocus() не остановил выбор, который был «в процессе», насколько это касается Flash. Чтобы увидеть эту проблему, используйте Firefox и в любом флеш-ролике с текстовым полем щелкните внутри текстового поля и перетащите за пределы всей вспышки. Затем отпустите мышь и, нажав кнопку мыши, наведите курсор на текстовое поле. Вы заметите, что выбор продолжается. – Josh

+0

Я понял, что вы имели в виду, и обновил мой пример. setFocus(), похоже, работает лучше с экземплярами Button. Вероятно, вы можете скрыть смену фокуса, поставив кнопку на сцену или установив для свойства _focusrect значение false. –

+0

Извините, я имею в виду проверить это в течение нескольких месяцев и просто не имел шансов! Я надеюсь протестировать его в ближайшие несколько недель и согласится, если он сработает. – Josh