Event.MOUSE_LEAVE не работает в AS3 - PullRequest
3 голосов
/ 08 апреля 2010

Я просто бросил этот супер простой пример кода в рамочный скрипт Flash CS4 IDE, но он ничего не выводит в консоль.Я просто наведите курсор мыши на окно, ничего не щелкая, и ничего не происходит.Почему это не работает так, как я ожидаю?

stage.addEventListener(Event.MOUSE_LEAVE, traceMouse);

function traceMouse(Evt:Event):void
 {
 trace("Mouse Left Stage");
 }

________________________________________________

[EDIT] Я считаю Event.MOUSE_LEAVE невероятно бесполезным.Во-первых, он не работает в среде тестирования (по крайней мере, на Flash CS4 для Mac OS X).во-вторых, он не срабатывает, если MouseEvent.MOUSE_DOWN в данный момент активен:

Справочник по языку Flash CS4 Professional ActionScript 3.0:

Обновлено 8/11/09: добавлена ​​квалификация этого событияне срабатывает при нажатии кнопки. 1

в моей конкретной ситуации я хотел, чтобы MOUSE_LEAVE срабатывал во время перетаскивания объекта, чтобы в случае, если пользователь перетаскивает его / ееуказатель мыши за сценой запускает stopDrag ().поскольку это невозможно, я решил использовать MOUSE_OUT для реального объекта, а не MOUSE_LEAVE для родительского объекта или рабочей области.

 private function mouseDownHandler(evt:MouseEvent):void
  {
  object.addEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler);
  object.startDrag(false, pullBounds);
  }

 private function mouseUpHandler(evt:MouseEvent):void
  {
  object.removeEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler);
  object.stopDrag();
  }

 private function mouseOutHandler(evt:MouseEvent):void
  {
  object.stopDrag();
  }

Ответы [ 2 ]

3 голосов
/ 18 мая 2011

Вот пара дополнительных хитростей, которые нужно знать (при работе в браузере):

Одна странная вещь в том, что в Chrome + Firefox событие MOUSE_LEAVE не отправляется для WMODE из OPAQUE или TRANSPARENT. Он просто не стреляет - мышкой вниз или вверх.

С WINDOW работает нормально. Это заняло у меня много времени, чтобы узнать! гр ... http://bugs.adobe.com/jira/browse/FP-892


Во-вторых, убедитесь, что вы используете Event в качестве типа параметра для вашего обработчика Event.MOUSE_LEAVE, а не MouseEvent. Если вы попытаетесь обработать MOUSE_LEAVE с помощью e:MouseEvent, вы получите ошибку, которую вы можете никогда не увидеть (если только вы не используете отладочный флэш-плеер). Это очень простая ошибка, потому что вы, вероятно, указываете всем другим обработчикам на тот же метод.

Вот что я делаю: (просто позвоните моему основному endDrag с mouseLeave(e:Event)

stage.addEventListener(MouseEvent.MOUSE_MOVE, drag);
stage.addEventListener(MouseEvent.MOUSE_UP, endDrag);
stage.addEventListener(Event.DEACTIVATE, endDrag);
stage.addEventListener(Event.MOUSE_LEAVE, mouseLeave);

private function mouseLeave(e:Event):void
{
    endDrag(new MouseEvent("MOUSE_LEAVE"));
}

public function endDrag(evt:MouseEvent):void
{
    /// handle end drag
}
1 голос
/ 08 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...