Quero uma função que me diga sobre qual elemento o cursor do mouse está.
Assim, por exemplo, se o mouse do usuário estiver sobre esta textarea (com id wmd-input
), a chamada window.which_element_is_the_mouse_on()
será funcionalmente equivalente a$("#wmd-input")
javascript
dom
mouse
Tom Lehman
fonte
fonte
event.target
ou qualquer outra coisaevent.target
?event
é e como veio a serEm navegadores mais recentes, você pode fazer o seguinte:
Isso lhe dará uma NodeList de itens sobre os quais o mouse está atualmente na ordem do documento. O último elemento da NodeList é o mais específico, cada um que o precede deve ser um pai, avô e assim por diante.
fonte
<li>
pouco sobre os outros<li>
elementos.$(':hover')
mas é basicamente a mesma coisa: jsfiddle.net/pmrotule/2pks4tf6(function(){ var q = document.querySelectorAll(":hover"); return q[q.length-1]; })()
mousemove
pode prejudicar o desempenhoEmbora o seguinte possa não responder de fato à pergunta, visto que este é o primeiro resultado da pesquisa no Google (o googler pode não fazer exatamente a mesma pergunta :), espero que ele forneça alguma entrada extra.
Na verdade, existem duas abordagens diferentes para obter uma lista de todos os elementos sobre os quais o mouse está atualmente (para navegadores mais recentes, talvez):
A abordagem "estrutural" - árvore DOM ascendente
Como na resposta do dherman, pode-se ligar
No entanto, isso pressupõe que apenas os filhos irão sobrepor seus ancestrais, o que geralmente é o caso, mas não é verdade em geral, especialmente ao lidar com SVG, onde elementos em diferentes ramos da árvore DOM podem se sobrepor.
A abordagem "visual" - com base na sobreposição "visual"
Este método usa
document.elementFromPoint(x, y)
para encontrar o elemento superior, ocultá-lo temporariamente (já que o recuperamos imediatamente no mesmo contexto, o navegador não irá renderizá-lo de fato), então vá para encontrar o segundo elemento superior ... Parece um pouco estranho, mas ele retorna o que você espera quando há, por exemplo, elementos irmãos em uma árvore obstruindo um ao outro. Encontre esta postagem para mais detalhes,Experimente ambos e verifique seus diferentes retornos.
fonte
Document.elementsFromPoint(x, y)
stackoverflow.com/a/31805883/1059828elementFromPoint()
obtém apenas o primeiro elemento na árvore DOM. Isso NÃO é suficiente para as necessidades dos desenvolvedores. Para obter mais de um elemento, por exemplo, na posição atual do ponteiro do mouse, esta é a função de que você precisa:Isso retorna uma matriz de todos os objetos de elemento em um determinado ponto. Basta passar os valores X e Y do mouse para esta função.
Mais informações aqui: https://developer.mozilla.org/en-US/docs/Web/API/document/elementsFromPoint
Para navegadores muito antigos que não são suportados, você pode usar esta resposta como alternativa.
fonte
Passe o mouse sobre a bolha de eventos, para que você possa colocar um único ouvinte no corpo e esperar que eles borbulhem e, em seguida, pegue o
event.target
ouevent.srcElement
:fonte
document.elementFromPoint(x, y)
.O código a seguir o ajudará a obter o elemento do ponteiro do mouse. Os elementos resultantes serão exibidos no console.
fonte
e.clientX
e em seue.clientY
lugar (testado no Firefox 59).Você pode olhar para o alvo do
mouseover
evento em algum ancestral adequado:Aqui está uma demonstração.
fonte
fonte
DEMO: D Mova o mouse na janela de snippet: D
fonte
O destino do
mousemove
evento DOM é o elemento DOM mais alto sob o cursor quando o mouse se move:Isso é semelhante à solução de @Philip Walton, mas não requer jQuery ou um setInterval.
fonte
Você pode usar este seletor para undermouse objeto e então manipulá-lo como objeto jquery.
$(':hover').last();
fonte
Deixe-me começar dizendo que não recomendo usar o método que estou prestes a sugerir. É muito melhor usar impulsionado evento de desenvolvimento e se ligam eventos apenas para os elementos que você estiver interessado em saber se o mouse está sobre com
mouseover
,mouseout
,mouseenter
,mouseleave
, etc.Se você absolutamente DEVE ter a capacidade de saber qual elemento o mouse está sobre o qual está passando, você precisará escrever uma função que vincule o
mouseover
evento a tudo no DOM e, em seguida, armazenar o que quer que o elemento atual esteja em alguma variável.Você poderia fazer algo assim:
Basicamente, criei uma função imediata que define o evento em todos os elementos e armazena o elemento atual dentro do encerramento para minimizar sua pegada.
Aqui está uma demonstração de trabalho que chama a
window.which_element_is_the_mouse_on
cada segundo e registra qual elemento o mouse está atualmente sobre o console.http://jsfiddle.net/LWFpJ/1/
fonte
A pergunta antiga, mas aqui está uma solução para aqueles que ainda podem estar lutando. Você deseja adicionar um
mouseover
evento ao elemento 'pai' do (s) elemento (s) filho (s) que deseja detectar. O código abaixo mostra como fazer isso.DEMO NO CODEPEN
fonte