ГлавнаяActionScript 3 — «100 советов» › Глобальные события

Глобальные события

June 19th, 2006
В ActionScript 1 и 2 имелись события onMouseDown и onMouseUp, которые вызывались во всех объектах не зависимо от того, где находилась мышка. В ActionScript 3 такие события распространяются только на те объекты, над которыми находится мышка в момент клика. К примеру, если ваш мувиклип обрабатывает события MOUSE_DOWN и MOUSE_UP, а пользователь нажал кнопку мыши над мувиклипом, отвел мышку в сторону и отпустил кнопку, то событие MOUSE_UP ваш мувиклип не получит. Для обработки события глобально в ActionScript 3 нужно добавлять обработчик события к Stage. Поскольку именно к stage добавляются все отображаемые объекты, то через него проходят все события.
Одна маленькая, но важная деталь. Что если вы добавили обработчик события к stage, а какой-то мувиклип использовал предотвращение распространения события (см. предыдущий совет), в этом случае ваш обработчик события вызван не будет. Значит нужно добавлять обработчик события к stage на фазу захвата (capture). Но если пользователь кликнет по пустому месту, где нет никаких объектов, то целью события в этом случае будет stage и ваш обработчик события на фазу захвата (capture) вызван не будет, поскольку stage в данном случае участвует только в фазе обработка (targeting). Получается, для того чтобы поймать событие глобально в любом случае, нужно добавить два обработчика события к stage на фазе захвата (capture) и на фазе обработка (targeting). Поскольку нельзя поставить обработчик события только на фазу обработка (targeting), то нужно будет фазу подъема (bubbling) игнорировать в обработчике.
Пример:

Код:
var circle:Sprite = new Sprite(); circle.graphics.beginFill(0x4080A0); circle.graphics.drawCircle(50, 50, 25); addChild(circle); // Используем stage для глобальной обработки mouse up stage.addEventListener(MouseEvent.MOUSE_UP, mouseUp); stage.addEventListener(MouseEvent.MOUSE_UP, mouseUp, true); function mouseUp(evt:MouseEvent):void { // обрабатываем только фазы capturing и target if (evt.eventPhase == EventPhase.BUBBLING_PHASE) return; trace("global mouseUp"); } // пусть мувиклип circle предотвращает распространение события mouse up circle.addEventListener(MouseEvent.MOUSE_UP, mouseUpCircle); function mouseUpCircle(evt:MouseEvent):void { trace("mouseUpCircle"); evt.stopPropagation(); }

Даже не смотря на то, что circle вызывает stopPropagation для предотвращения распространения события, в этом случае наш глобальный обработчик будет вызван на фазе захвата (capturing)

Код:
//клик вне мувиклипа global mouseUp // клик по мувиклипу circle global mouseUp mouseUpCircle

Категория: ActionScript 3 — «100 советов» Ярлыки: ,

Смотрите также

Предотвращение распространения события Реализация onReleaseOutside в AS3
  1. Пока без комментариев.
  1. Пока нету.