Cómo detener el burbujeo del evento al hacer clic en la casilla de verificación

votos
149

Tengo una casilla de verificación que quiero realizar alguna acción de Ajax en el evento de clic, sin embargo, la casilla de verificación también está dentro de un contenedor con su propio comportamiento de clic que no quiero ejecutar cuando se hace clic en la casilla de verificación. Esta muestra ilustra lo que quiero hacer:

<html lang=en>
    <head>
        <title>Test</title>
        <script type=text/javascript src=http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js></script>
        <script type=text/javascript>
        $(document).ready(function() {
            $('#container').addClass('hidden');
            $('#header').click(function() {
                if($('#container').hasClass('hidden')) {
                    $('#container').removeClass('hidden');
                } else {
                    $('#container').addClass('hidden');
                }
            });
            $('#header input[type=checkbox]').click(function(event) {
                // Do something
            });
        });
        </script>
        <style type=text/css>
        #container.hidden #body {
            display:none;
        }
        </style>
    </head>
    <body>
        <div id=container>
            <div id=header>
                <h1>Title</h1>
                <input type=checkbox name=test />
            </div>
            <div id=body>
                <p>Some content</p>
            </div>
        </div>
    </body>
</html>

Sin embargo, no puedo encontrar la manera de detener el burbujeo del evento sin hacer que el comportamiento del clic predeterminado (casilla de verificación activada / desactivada) no se ejecute.

Ambas cosas detienen el burbujeo del evento pero tampoco cambian el estado de la casilla de verificación:

event.preventDefault();
return false;
Publicado el 22/07/2009 a las 10:55
fuente por usuario
En otros idiomas...                            


8 respuestas

votos
30

Use el método stopPropagation:

event.stopPropagation();
Respondida el 22/07/2009 a las 11:06
fuente por usuario

votos
272

reemplazar

event.preventDefault();
return false;

con

event.stopPropagation();

event.stopPropagation ()

Detiene el borboteo de un evento a elementos principales, lo que impide que se notifique a ningún controlador principal del evento.

event.preventDefault ()

Impide que el navegador ejecute la acción predeterminada. Utilice el método isDefaultPrevented para saber si este método alguna vez se llamó (en ese objeto de evento).

Respondida el 22/07/2009 a las 11:06
fuente por usuario

votos
5

Como otros han mencionado, intente stopPropagation().

Y hay un segundo controlador para probar: event.cancelBubble = true;es un controlador específico de IE, pero es compatible al menos con FF. Realmente no sé mucho al respecto, ya que no lo he usado, pero podría valer la pena, si todo lo demás falla.

Respondida el 22/07/2009 a las 11:12
fuente por usuario

votos
25

No se olvide de IE:

if (event.stopPropagation) {    // standard
        event.stopPropagation();
    } else {    // IE6-8
        event.cancelBubble = true;
}
Respondida el 16/12/2012 a las 10:50
fuente por usuario

votos
4

Este es un excelente ejemplo para entender el concepto de eventos burbujeante. Con base en las respuestas anteriores, el código final se verá así como se menciona a continuación. Cuando el usuario hace clic en la casilla de verificación de propagación evento para 'cabecera' su elemento padre será dejado de usar event.stopPropagation();.

$(document).ready(function() {
            $('#container').addClass('hidden');
            $('#header').click(function() {
                if($('#container').hasClass('hidden')) {
                    $('#container').removeClass('hidden');
                } else {
                    $('#container').addClass('hidden');
                }
            });
          $('#header input[type=checkbox]').click(function(event) {
              if (event.stopPropagation) {    // standard
                   event.stopPropagation();
               } else {    // IE6-8
                    event.cancelBubble = true;
               }
          });     
  });
Respondida el 27/07/2015 a las 10:13
fuente por usuario

votos
5

Cuando se utiliza jQuery que no es necesario llamar a una función de parada separado ..

Usted puede simplemente return falseen el controlador de eventos

Esto detendrá el evento y cancelar burbujeo ..

Ver también:

event.preventDefault () return false vs.

A partir de la documentación de jQuery:

Estos controladores, por lo tanto, pueden impedir que el manejador delegado de activación llamando event.stopPropagation () o devolver falsa.

Respondida el 17/08/2015 a las 10:36
fuente por usuario

votos
0

Crédito para @mehras para el código. Acabo de crear un fragmento de demostrar porque pensé que sería apreciada y quería una excusa para tratar esa característica.

$(document).ready(function() {
            $('#container').addClass('hidden');
            $('#header').click(function() {
                if($('#container').hasClass('hidden')) {
                    $('#container').removeClass('hidden');
                } else {
                    $('#container').addClass('hidden');
                }
            });
          $('#header input[type=checkbox]').click(function(event) {
              if (event.stopPropagation) {    // standard
                   event.stopPropagation();
               } else {    // IE6-8
                    event.cancelBubble = true;
               }
          });     
  });
div {
  text-align: center;
  padding: 2em;
  font-size:1.2em
}
.hidden {
  display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="header"><input type="checkbox"/>Checkbox won't bubble the event,
 but this text will.</div>
<div id="container">click() bubbled up!</div>

Respondida el 19/04/2017 a las 17:39
fuente por usuario

votos
-1

En AngularJS esto debería trabajos:

event.preventDefault(); 
event.stopPropagation();
Respondida el 22/05/2017 a las 06:08
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more