2010-03-05 19 views
37

to tylko szybkie pytanie. Mam problem z div z onclick javascript w sobie nawzajem. Kiedy klikam na wewnętrzny div, powinien on uruchamiać tylko javascript onclick, ale javascript zewnętrznego div również jest uruchamiany. W jaki sposób użytkownik może kliknąć na wewnętrzny div bez uruchamiania zewnętrznego javascript?Howto: div z onclick wewnątrz innego div z onclick javascript

<html> 
<body> 
<div onclick="alert('outer');" style="width:300px;height:300px;background-color:green;padding:5px;">outer div 
    <div onclick="alert('inner');" style="width:200px;height:200px;background-color:white;" />inner div</div> 
</div> 
</div> 
</body> 
</html> 
+1

Duplikat. http://stackoverflow.com/questions/2015041/two-differents-onclick-on-two-divs-one-over-the-other – vpram86

+4

Zduplikowane pytanie, ale lepsze odpowiedzi. –

Odpowiedz

70

Zasadniczo istnieją dwa modele zdarzeń w języku JavaScript. Przechwytywanie zdarzeń i Event bulgotanie. W przypadku propagacji, jeśli klikniesz na wewnętrzny element div, wewnętrzne zdarzenie kliknięcia div uruchomi się jako pierwsze, a następnie uruchomi się zewnętrzne kliknięcie div. podczas przechwytywania zdarzeń najpierw zostanie wywołane zewnętrzne zdarzenie div, a następnie wewnętrzne zdarzenie div zostanie odpalone. Aby zatrzymać propagację zdarzeń, użyj tego kodu w swojej metodzie kliknięcia.

if (!e) var e = window.event; 
    e.cancelBubble = true; 
    if (e.stopPropagation) e.stopPropagation(); 
+0

dziękuję, prosta, jasna odpowiedź i działa doskonale –

+1

Dzięki. Doskonała odpowiedź; właśnie tego szukałem. –

5

return false; z funkcją onclick śródmiejskiego div:

<div onclick="alert('inner'); return false;" ... 

Co masz do czynienia ze nazywa event propagation.

+0

Metoda, którą sugerujesz, nie działa. (Przynajmniej nie w żadnej z przeglądarek, które właśnie podwoiłem, sprawdziłem to - Firefox 3.6, IE8.) Zauważ, że twój link faktycznie mówi, że używasz innej metody, którą dałem w mojej odpowiedzi. –

17

Sprawdź informacji na temat rozmnażania zdarzeń here

W szczególności będziemy chcieli trochę kodu takiego w swoim obsługi zdarzeń, aby zatrzymać zdarzenia z rozmnożeniowego:

function myClickHandler(e) 
{ 
    // Here you'll do whatever you want to happen when they click 

    // now this part stops the click from propagating 
    if (!e) var e = window.event; 
    e.cancelBubble = true; 
    if (e.stopPropagation) e.stopPropagation(); 
} 
+0

Dziękujemy! to zadziałało dla mnie – CraZyDroiD

2

Jest to przypadek bulgotanie zdarzeń .

Można użyć

e.cancelBubble = true; //IE 

i

e.stopPropagation(); //FF 
+0

zajęło mi trochę czasu, aby zrozumieć, ale dostałem go teraz, thx –

0

Here jest kilka odniesienia, aby pomóc w zrozumieniu javascript wydarzenie stacjonarnego.

2

Jeszcze jeden sposób na przeglądarkach WebKit oparte:

<div onclick="alert('inner'); event.stopPropagation;" ... 
+1

działa to jednak w następujący sposób: onclick = "alert ('inner'); event.stopPropagation();" –

+0

To zadziałało dla mnie i przetestowałem to na Opera (46), Chrome (59.0.3071.115), FireFox Developer (55.0b9 (32-bit)), Internet Explorer 11 –

0

To był bardzo pomocny, ale to nie działa dla mnie.

Co zrobiłem, opisano here.

Włożyłem więc warunek do zewnętrznej onclick imprezy:

if(!event.isPropagationStopped()) { 
    window.location.href = url; 
} 
4

Wystarczy dodać ten kod:

window.event.stopPropagation(); 
+0

To nie działa dla mnie. Najlepsza odpowiedź jest bardziej dokładna. –

0

Można użyć

$("divOrClassThatYouDontWantToPropagate").click(function(event) { 
 
     event.stopPropagation(); 
 
    });

Powiązane problemy