Come smettere di bubbling degli eventi sulla casella di click

voti
149

Ho una casella di controllo che voglio eseguire alcune azioni Ajax l'evento click, ma la casella di controllo è anche all'interno di un contenitore con il proprio comportamento del clic che io non voglio correre quando la casella di controllo viene cliccato. Questo esempio illustra ciò che voglio fare:

<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>

Tuttavia, non riesco a capire come fermare il bubbling degli eventi senza causare il comportamento di default clic (casella di diventare selezionata / deselezionata) per non correre.

Entrambi i seguenti fermare il bubbling degli eventi ma anche non cambiare lo stato casella di controllo:

event.preventDefault();
return false;
È pubblicato 22/07/2009 alle 10:55
fonte dall'utente
In altre lingue...                            


8 risposte

voti
30

Utilizzare il metodo stopPropagation:

event.stopPropagation();
Risposto il 22/07/2009 a 11:06
fonte dall'utente

voti
272

sostituire

event.preventDefault();
return false;

con

event.stopPropagation();

event.stopPropagation ()

Interrompe il gorgogliare di un evento di elementi padre, impedendo qualsiasi gestore genitore dalla notifica della manifestazione.

event.preventDefault ()

Impedisce al browser di eseguire l'azione predefinita. Utilizzare il metodo isDefaultPrevented sapere se questo metodo è stato mai chiamato (su tale oggetto evento).

Risposto il 22/07/2009 a 11:06
fonte dall'utente

voti
5

Come altri hanno detto, provare stopPropagation().

E c'è un secondo gestore di provare: event.cancelBubble = true;E 'un gestore specifico IE, ma è supportato in almeno FF. In realtà non so molto su di esso, come non ho usato io stesso, ma forse vale la pena un colpo, se tutto il resto fallisce.

Risposto il 22/07/2009 a 11:12
fonte dall'utente

voti
25

Non dimenticare di IE:

if (event.stopPropagation) {    // standard
        event.stopPropagation();
    } else {    // IE6-8
        event.cancelBubble = true;
}
Risposto il 16/12/2012 a 10:50
fonte dall'utente

voti
4

Questo è un ottimo esempio per capire bubbling degli eventi concetto. Sulla base delle risposte di cui sopra, il codice finale sarà simile a come indicato di seguito. In cui l'utente clicca sulla casella propagazione evento 'intestazione' suo elemento genitore verrà smesso di utilizzare 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;
               }
          });     
  });
Risposto il 27/07/2015 a 10:13
fonte dall'utente

voti
5

Quando si utilizza jQuery non è necessario chiamare una funzione d'arresto separato ..

Si può solo return falsenel gestore di eventi

Questo fermerà l'evento ed annullare bubbling ..

Vedi anche:

event.preventDefault () vs. return false

Dalla documentazione jQuery:

Questi gestori, quindi, possono evitare che il gestore delegato da innescare chiamando event.stopPropagation () o di ritorno falso.

Risposto il 17/08/2015 a 10:36
fonte dall'utente

voti
0

Credito al @mehras per il codice. Ho appena creato un frammento di dimostrare perché ho pensato che sarebbe stato apprezzato e ho voluto una scusa per provare questa funzione.

$(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>

Risposto il 19/04/2017 a 20:39
fonte dall'utente

voti
-1

In angularjs questo dovrebbe opere:

event.preventDefault(); 
event.stopPropagation();
Risposto il 22/05/2017 a 09:08
fonte dall'utente

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