Qual é a diferença entre Event.target, Event.toElement e Event.srcElement?

87

Eu tenho o seguinte código:

document.oncontextmenu = function(evt) {
    evt = evt || window.event;
    console.log(evt.target, evt.toElement, evt.srcElement);
};

Ao clicar com o botão direito do mouse em a <div class="foo"></div>, retorna este:

div.foo, div.foo, div.foo

Ao clicar com o botão direito do mouse em a <input>, retorna este:

entrada, entrada, entrada

Todos parecem trazer o mesmo resultado. Existe alguma situação em que um deles tenha uso diferente dos outros?

Guilherme Nascimento
fonte

Respostas:

78

O destino do evento é o elemento para o qual o evento é despachado:

O objeto para o qual um evento é direcionado usando o fluxo de eventos DOM . O destino do evento é o valor do Event.target atributo.

srcElementé uma maneira não padrão do IE de obter o target.

O destino do evento atual é o elemento que possui o ouvinte de evento que é atualmente invocado:

Em um fluxo de eventos, o destino do evento atual é o objeto associado ao manipulador de eventos que está sendo despachado no momento. Este objeto PODE ser o próprio alvo do evento ou um de seus ancestrais. O destino do evento atual muda conforme o evento se propaga de objeto a objeto por meio das várias fases do fluxo de eventos. O destino do evento atual é o valor do Event.currentTargetatributo.

Usar thisdentro de um ouvinte de evento é uma maneira comum (e padrão) de obter o destino do evento atual.

Alguns tipos de eventos têm relatedTarget:

Usado para identificar um secundário EventTargetrelacionado a um evento de UI, dependendo do tipo de evento.

fromElemente toElementsão formas não padronizadas do IE de obter o relatedTarget.

Oriol
fonte
7
Estou usando "toElement" na versão 60 do Chrome - tem certeza de que é um "modo não padrão do IE"?
PandaWood
2
O MSDN diz que é "fora do padrão" e "não o use em sites de produção voltados para a web": developer.mozilla.org/en-US/docs/Web/API/Event/srcElement
TetraDev
o cromo mais recente é compatível com "toElement", mas não com o Mozilla Firefox. Tive que usar a propriedade 'target' para oferecer suporte a alguns casos no Mozilla.
Vishal