Eu tenho um DIV com um DIV classificado foobar
e alguns DIV dentro desse DIV que não são classificados, mas suponho que eles estejam herdando a foobar
classe:
$('.foobar').on('click', function() { /*...do stuff...*/ });
Quero que isso seja acionado apenas ao clicar em algum lugar no DIV, mas não nos DIVs filhos.
===
ou!==
usa o "Algoritmo estrito de comparação de igualdade" , enquanto o==
e!=
usa o "Algoritmo abstrato de comparação de igualdade" , que é do tipo coercitivo. A sabedoria geral é sempre usar comparação estrita, a menos que haja uma necessidade específica do tipo coercitivo (já que suas regras são um pouco complexas) . Nesse caso, como os objetos estão sendo comparados, isso realmente não faz diferença, mas você verá que a maioria das pessoas ainda mantém a comparação estrita .Existe outra maneira de funcionar, se você não se importa de segmentar navegadores mais recentes. Basta adicionar o CSS
a qualquer filho da div que você deseja capturar o clique. Aqui estão as tabelas de suporte
http://caniuse.com/#feat=pointer-events
fonte
click
acionador de evento de clique programático seja bloqueado?Você pode usar bolhas a seu favor:
fonte
<a>
elementos descendentes . Há apenas um problema: quando clico no meio deles, o evento ainda é acionado (testado no Google Chrome). Existe uma variante disso que também impede isso?Não recebi a resposta aceita para o trabalho, mas isso parece funcionar, pelo menos no JS vanilla.
fonte
this
porque o objeto quethis
está apontando para a mudança pode dependendo do escopo e do contexto de onde é chamadoIsso interromperá a propagação (subida) do
click
evento em qualquer um dos elementos filhos do (s).foobar
elemento (s), para que o evento não atinja o.foobar
(s) elemento (s) para disparar seus manipuladores de eventos.Aqui está uma demonstração: http://jsfiddle.net/bQQJP/
fonte
fonte
Eu tive o mesmo problema e surgiu com esta solução (com base nas outras respostas)
Basicamente, diz que se o destino é a div, execute o código, caso contrário não faça nada (não o oculte)
fonte
Meu caso é semelhante, mas é a ocasião em que você tem poucos
foobar
-s e deseja fechar apenas um - por um clique:Localizar caso pai
Localizar caso filho
fonte
Você pode usar event.currentTarget. Ele fará clique apenas no evento que não obteve o evento.
fonte
Se você não pode usar
pointer-events: none;
e está direcionando navegadores modernos, podecomposedPath
detectar um clique direto no objeto da seguinte maneira:Você pode ler mais sobre o composPath aqui: https://developer.mozilla.org/en-US/docs/Web/API/Event/composedPath
fonte
fonte