Hvordan stoppe arrangementet bobler på boksen klikk

stemmer
155

Jeg har en knapp som jeg ønsker å utføre noen Ajax aksjon på klikkhendelsen, men boksen er også inne i en container med sin egen klikk oppførsel som jeg ikke ønsker å kjøre når boksen er klikket. Denne prøven viser hva jeg ønsker å gjøre:

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

Men jeg kan ikke finne ut hvordan å stoppe arrangementet bobler uten at standard klikk atferd (boksen blir sjekket / ukontrollert) for å ikke kjøre.

Begge følgende stoppe arrangementet boblende, men også endrer ikke boksen tilstand:

event.preventDefault();
return false;
Publisert på 22/07/2009 klokken 09:55
kilden bruker
På andre språk...                            


8 svar

stemmer
30

Bruk stopPropagation metoden:

event.stopPropagation();
Svarte 22/07/2009 kl. 10:06
kilden bruker

stemmer
282

erstatte

event.preventDefault();
return false;

med

event.stopPropagation();

event.stopPropagation ()

Stopper gjennombobling av en hendelse til foreldreelementene og hindrer eventuelle moder handlers fra å bli varslet om hendelsen.

event.preventDefault ()

Hindrer leseren fra å utføre standardhandlingen. Bruke metoden isDefaultPrevented å vite om denne metoden gang ble kalt (på den hendelsen objekt).

Svarte 22/07/2009 kl. 10:06
kilden bruker

stemmer
5

Som andre har nevnt, prøve stopPropagation().

Og det er en andre handler prøve: event.cancelBubble = true;Det er en IE bestemt handler, men det er støttet i minst FF. Ikke vet mye om det, som jeg ikke har brukt det selv, men det kan være verdt et skudd, hvis alt annet svikter.

Svarte 22/07/2009 kl. 10:12
kilden bruker

stemmer
26

Ikke glem IE:

if (event.stopPropagation) {    // standard
        event.stopPropagation();
    } else {    // IE6-8
        event.cancelBubble = true;
}
Svarte 16/12/2012 kl. 09:50
kilden bruker

stemmer
4

Dette er et utmerket eksempel for å forstå hendelsen boblende konsept. Basert på ovennevnte svar, vil den endelige koden se ut som nevnt nedenfor. Hvor brukeren klikker på avkrysningsboksen arrangementet forplantning til dens overordnede element 'header' vil bli stoppet ved hjelp av 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;
               }
          });     
  });
Svarte 27/07/2015 kl. 10:13
kilden bruker

stemmer
5

Når du bruker jQuery du ikke trenger å ringe en stoppfunksjon skille ..

Du kan bare return falsei hendelsesbehandling

Dette vil stoppe arrangementet og avbryte bobler ..

Se også:

event.preventDefault () vs. return false

Fra jQuery docs:

Disse handlere kan derfor hindre delegert føreren fra å trigges ved å ringe event.stopPropagation () eller returneres falsk.

Svarte 17/08/2015 kl. 10:36
kilden bruker

stemmer
0

Takk til @mehras for koden. Jeg opprettet nettopp en bit for å demonstrere det fordi jeg trodde det ville bli verdsatt og jeg ønsket en unnskyldning for å prøve denne funksjonen.

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

Svarte 19/04/2017 kl. 20:39
kilden bruker

stemmer
-1

I angularjs dette bør verk:

event.preventDefault(); 
event.stopPropagation();
Svarte 22/05/2017 kl. 09:08
kilden bruker

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