impedir o estágio de receber eventos do mouse que ocorrem em outros objetos?
num projecto Flex actual, o utilizador é capaz de criar instâncias de uma classe personalizada baseada no contorno, seleccionando-as e mudando-as ou redimensionando-as. Eu gostaria de adicionar um ouvinte de eventos para detectar cliques do mouse que ocorrem em um contorno de fundo (ou o estágio), a fim de deseleccionar qualquer instância atualmente selecionada.
pode alguém delineia os passos para conseguir isso? Eu tentei tudo o que posso pensar (ativar/desativar useCapture
, tentando comparar eventos.alvo com evento.currentTarget, trying to test eventPhase).
meu projeto é muito complicado para postar, mas com o caso de teste simples abaixo, eu recebo a seguinte saída e não faz qualquer sentido para mim: o resultado é o mesmo.
então a minha pergunta: Como é que detecto eventos do rato que ocorrem apenas em objectos específicos?
clicando num instância de um container de fronteira personalizado:
----------stage click 1
stage is TARGET 1
----------stage click 1
stage is TARGET 1
-----------background click 1
background is currentTarget 1
-----------background click 3
background is currentTarget 3
----------stage click 3
stage is TARGET 3
----------stage click 3
stage is TARGET 3
clicando no background
directamente:
----------stage click 1
stage is TARGET 1
----------stage click 1
stage is TARGET 1
-----------background click 1
background is currentTarget 1
-----------background click 3
background is currentTarget 3
----------stage click 3
stage is TARGET 3
----------stage click 3
stage is TARGET 3
//-------------------
background.addEventListener(MouseEvent.CLICK, backgroundClick);
background.addEventListener(MouseEvent.CLICK, backgroundClick, true);
stage.addEventListener(MouseEvent.CLICK, stageClick);
stage.addEventListener(MouseEvent.CLICK, stageClick, true);
protected function backgroundClick(event:MouseEvent):void {
trace("-----------background click", event.eventPhase);
if (event.target == background){
trace("background is TARGET",event.eventPhase);
}
if (event.currentTarget == background){
trace("background is currentTarget",event.eventPhase);
}
}
protected function stageClick(event:MouseEvent):void {
trace("----------stage click",event.eventPhase);
if (event.target == stage){
trace("stage is currentTarget",event.eventPhase);
}
if (event.currentTarget == stage){
trace("stage is TARGET",event.eventPhase);
}
}
1 answers
Clique na bolha de eventos; isto significa que, a menos que pare a propagação; todos os Componentes da hierarquia, a partir do ponto em que o evento foi enviado até ao palco, receberão o evento click durante a fase de bolha. Adicionar ouvintes de eventos no palco irá pegar cada evento click no aplicativo; como o estágio é o nível superior da hierarquia.
Normalmente você adicionaria ouvintes de eventos a uma instância específica do seu Container de fronteira; não no palco.
Mais informações sobre como os eventos funcionam nos documentos.