Actualmente estoy usando jQuery para hacer clic en un div y en este div también tengo anclajes. El problema con el que me encuentro es que cuando hago clic en un ancla, ambos eventos de clic se activan (para el div y el ancla). ¿Cómo evito que se active el evento onclick del div cuando se hace clic en un ancla?
Aquí está el código roto:
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>
fuente
if( e.target !== this) return;
en el padre es mejor quee.stopPropagation()
en el niño, ya que nunca se sabe si alguien más adjunta algún controlador a los niños, o si una biblioteca debe adjuntar un controlador a un niño (y no desea meterse con el código de la biblioteca). Es una mejor separación de preocupaciones.if( e.target !== this) return;
cheque en el padre significa que si se hace clic en cualquiera de los otros hijos de ese padre que no tienen sus propios controladores onClick, entonces no sucede nada. Por lo tanto, es inútil para una situación en la que tiene, por ejemplo, un div padre cliqueable.e.stopPropagation()
funciona bien sin embargo.Use el método stopPropagation , vea un ejemplo:
Como dijo jQuery Docs:
Tenga en cuenta que no impide que otros oyentes manejen este evento (por ejemplo, más de un controlador de clic para un botón), si no es el efecto deseado, debe usarlo
stopImmediatePropagation
.fuente
Aquí mi solución para todos los que buscan un código que no sea jQuery (javascript puro)
Su código no se ejecutará si se hace clic en los hijos de los padres
fuente
window.event
utilicé, lo que MDN desalienta: developer.mozilla.org/en-US/docs/Web/API/Window/event . Si puede perder el tiempo, le agradecería si pudiera comentar por qué lo usówindow.event
(tal vez es un problema que existió en 2015 o no entendí el motivo).también puedes probar esto
fuente
Si no tiene la intención de interactuar con el / los elemento / s interno / s en ningún caso, entonces una solución CSS puede ser útil para usted.
Simplemente configure los elementos internos a
pointer-events: none
en tu caso:
o para apuntar a todos los elementos internos en general:
Este truco fácil me ahorró mucho tiempo mientras desarrollaba con ReactJS
El soporte del navegador se puede encontrar aquí: http://caniuse.com/#feat=pointer-events
fuente
Si tiene varios elementos en el div en el que se puede hacer clic, debe hacer esto:
fuente
Usar
return false;
oe.stopPropogation();
no permitirá que se ejecute más código. Se detendrá el flujo en este punto mismo.fuente
Escribir si alguien necesita (trabajó para mí):
De esta solución.
fuente
Alternativa en línea:
fuente
Aquí hay un ejemplo usando Angular 2+
Por ejemplo, si desea cerrar un componente modal si el usuario hace clic fuera de él:
fuente
Debe evitar que el evento llegue (burbujee) al padre (el div). Vea la parte sobre burbujear aquí , y la información de API específica de jQuery aquí .
fuente
fuente
Para especificar algún subelemento como no cliqueable, escriba la jerarquía css como en el siguiente ejemplo.
En este ejemplo, detengo la propagación a cualquier elemento (*) dentro de td dentro de tr dentro de una tabla con la clase ".subtable"
fuente
ignoreParent () es una solución pura de JavaScript.
Funciona como una capa intermedia que compara las coordenadas del clic del mouse con las coordenadas de los elementos secundarios. Dos simples pasos de implementación:
1. Ponga el código ignoreParent () en su página.
2. En lugar del onclick original del padre = "parentEvent ();" , escribir:
Puede pasar identificadores de cualquier número de elementos secundarios a la función y excluir otros.
Si hizo clic en uno de los elementos secundarios, el evento principal no se activa. Si hizo clic en el elemento primario, pero no en ninguno de los elementos secundarios [proporcionados como argumentos], se activa el evento principal.
código ignoreParent () en Github
fuente
Si está en contexto en línea, en HTML intente esto:
fuente
En caso de que alguien tuviera este problema usando React, así es como lo resolví.
scss:
Componente render ():
Al agregar una función onClick para el modal hijo (div de contenido), se evita que los eventos de clic del mouse alcancen la función 'closeLogin' del elemento padre.
Esto hizo el truco para mí y pude crear un efecto modal con 2 divs simples.
fuente
agregue
a
lo siguiente:o
return false;
desde el controlador de clic para me#clickable
gusta:fuente
Todas las soluciones son complicadas y de jscript. Aquí está la versión más simple:
fuente
fuente