Atualmente, estou usando o jQuery para tornar uma div clicável e nessa div também tenho âncoras. O problema que eu encontro é que, quando clico em uma âncora, os dois eventos de clique estão disparando (para a div e a âncora). Como impedir que o evento onclick da div seja acionado quando uma âncora é clicada?
Aqui está o código quebrado:
Javascript
var url = $("#clickable a").attr("href");
$("#clickable").click(function() {
window.location = url;
return true;
})
HTML
<div id="clickable">
<!-- Other content. -->
<a href="http://foo.com">I don't want #clickable to handle this click event.</a>
</div>
fonte
if( e.target !== this) return;
no pai é melhor do quee.stopPropagation()
no filho, pois você nunca sabe se alguém anexa algum manipulador aos filhos ou se uma biblioteca deve anexar um manipulador a um filho (e você não quer mexer no código da biblioteca). É uma melhor separação de preocupações.if( e.target !== this) return;
verificação no pai significa que, se algum dos outros filhos desse pai que não possui manipuladores onClick forem clicados, nada acontecerá. Portanto, é inútil para uma situação em que você tem, por exemplo, uma div principal clicável.e.stopPropagation()
funciona bem no entanto.Use o método stopPropagation , veja um exemplo:
Como dito pelo jQuery Docs:
Lembre-se de que isso não impede que outros ouvintes lidem com esse evento (por exemplo, mais de um manipulador de cliques para um botão); se esse não for o efeito desejado, você deverá usá-lo
stopImmediatePropagation
.fonte
Aqui está minha solução para todos que procuram um código não-jQuery (javascript puro)
Seu código não será executado se você clicar nos filhos dos pais
fonte
window.event
, o que o MDN desencoraja: developer.mozilla.org/en-US/docs/Web/API/Window/event . Se você pode poupar o tempo, eu apreciaria se você pudesse comentar por que usouwindow.event
(talvez seja um problema que existisse em 2015 ou que não entendi o motivo).você também pode tentar isso
fonte
Se você não pretende interagir com o (s) elemento (s) interno (s) em nenhum caso, uma solução CSS pode ser útil para você.
Basta definir o (s) elemento (s) interno (s) como
pointer-events: none
no seu caso:
ou direcionar todos os elementos internos em geral:
Esse hack fácil me salvou muito tempo enquanto desenvolvia com o ReactJS
O suporte ao navegador pode ser encontrado aqui: http://caniuse.com/#feat=pointer-events
fonte
Se você tiver vários elementos na div clicável, faça o seguinte:
fonte
Usar
return false;
oue.stopPropogation();
não permitirá que mais códigos sejam executados. Parará o fluxo neste ponto em si.fonte
Escrever se alguém precisar (trabalhou para mim):
A partir desta solução.
fonte
Alternativa em linha:
fonte
Aqui está um exemplo usando Angular 2+
Por exemplo, se você deseja fechar um componente modal, se o usuário clicar fora dele:
fonte
Você precisa impedir que o evento alcance (borbulhando para) o pai (a div). Veja a parte sobre bolhas aqui e informações da API específicas do jQuery aqui .
fonte
fonte
Para especificar algum subelemento como não clicável, escreva a hierarquia css como no exemplo abaixo.
Neste exemplo, paro a propagação para qualquer elemento (*) dentro de td dentro de tr dentro de uma tabela com a classe ".subtable"
fonte
ignoreParent () é uma solução JavaScript pura.
Funciona como uma camada intermediária que compara as coordenadas do clique do mouse com as coordenadas do (s) elemento (s) filho (s). Duas etapas simples de implementação:
1. Coloque o código ignoreParent () na sua página.
2. Em vez do original onclick dos pais = "parentEvent ();" , Escreva:
Você pode passar IDs de qualquer número de elementos filho para a função e excluir outros.
Se você clicou em um dos elementos filho, o evento pai não é acionado. Se você clicou no pai, mas não em nenhum dos elementos filhos [fornecidos como argumentos], o evento pai é disparado.
código ignoreParent () no Github
fonte
Se estiver no contexto embutido, em HTML, tente o seguinte:
fonte
Caso alguém tenha esse problema usando o React, é assim que eu o resolvi.
scss:
Renderização do componente ():
Ao adicionar uma função onClick ao modal filho (div de conteúdo), os eventos de clique do mouse são impedidos de alcançar a função 'closeLogin' do elemento pai.
Isso fez o truque para mim e eu pude criar um efeito modal com 2 divs simples.
fonte
adicione da
a
seguinte maneira:ou
return false;
do manipulador de cliques para algo#clickable
como:fonte
Todas as soluções são complicadas e de jscript. Aqui está a versão mais simples:
fonte
fonte