2012-02-17 11 views
10

Używam w mojej aplikacji event.stopPropagation(). Pojawił się jednak jeden scenariusz, w którym chcę, aby propagacja była kontynuowana tak, jakby wspomniana funkcja nigdy nie była wywoływana. Tak się zastanawiam; Czy istnieje sposób na "wznowienie" propagacji po jej zatrzymaniu? Byłoby strasznie nużące, aby przenieść jedno połączenie do event.stopPropagation na kilkanaście oddzielnych instrukcji warunkowych.Jak cofnąć event.stopPropagation w jQuery?

+0

Mmmm ... http: //stackoverflow.com/questions/4735006/javascript-how-to-enable-stoppropagation – elclanrs

+0

Gdyby nie było takiego obiektu, nie będzie trzeba tuzina instrukcje warunkowe, aby zdecydować, czy powinien przywołać to? – Jon

+0

Oni już tam są. Byłoby jedno wołanie do 'event.stopPropagation()' i (rzadko) jedno wywołanie do hipotetycznego 'event.resumePropagation()'. Byłoby to lepsze niż wywołanie 'event.stopPropagation()' we wszystkich warunkowych poza jednym – Hubro

Odpowiedz

14

Po zatrzymaniu propagacji nie można jej wznowić. Jako obejście, co można zrobić, to ustawić zmienną, a potem tylko zatrzymać, gdy zmienna ta jest prawdziwa:

var stop = false; 
// do your logic here 
if(stop){ 
    event.stopPropagation(); 
} 
+3

Nie pomyślałem o tym. To jest czystsze niż moje rozwiązanie do tworzenia kopii zapasowych. Byłoby optymalne, gdybyś mógł edytować swoją odpowiedź i uwzględnić fakt, że "kiedy propagacja została zatrzymana, ** nie może być wznowiona" – Hubro

+0

Wystarczy ją edytować! – Schiavini

2

Zadzwoń pod numer event.stopPropagation() w swoim stanie. Na przykład:

$el.click(function(event) { 
    if (some_condition) { 
     event.stopPropagation() 
     // do stuff 
    } 
    else { 
     // do other stuff, without stopping propagation 
    } 
}); 

Żmudne może być, ale niestety stopPropagation jest przełącznikiem w jedną stronę. Po zatrzymaniu nie można go włączyć z powrotem na to samo wydarzenie.

+0

To nie jest warunek "a". To ** wiele ** warunków. Cytując się: "Byłoby strasznie nużącym przenieść jedno wezwanie do event.stopPropagation na kilkanaście oddzielnych instrukcji warunkowych" – Hubro

+0

Może to być nudne, ale niestety 'stopPropagation' jest przełącznikiem w jedną stronę. Po zatrzymaniu nie można go włączyć z powrotem na to samo wydarzenie. –

+0

Teraz ** to ** jest odpowiedzią, której szukałem. Ponieważ to faktycznie odpowiada na moje pytanie, zaakceptuję je, jeśli edytujesz – Hubro

2

Wystarczy byłaby oryginalne zdarzenie tak:

var refEvent = event.originalEvent; 
refEvent.cancelBubble = false; 
refEvent.defaultPrevented = false; 
refEvent.returnValue = true; 
refEvent.timeStamp = (new Date()).getTime(); 

if (event.target.dispatchEvent){ 
    event.target.dispatchEvent(refEvent); 
} else if (event.target.fireEvent) { 
    event.target.fireEvent(refEvent); 
} 
+4

Czy możesz podać przykład działania zdarzenia zatrzymanego za pomocą metody e.stopPropagation(), a następnie ponownie uruchomić z powyższym przykładem? Nie mogłem go uruchomić, ale wygląda na to w teorii. – gfullam

0

Oto rozwiązanie działa:

$('#mydiv').on('click.new', function(e){ 

    e.stopImmediatePropagation(); 

alert('this will happen only once'); 

$('#mydiv').unbind('click.new'); 

}); 

Wykorzystuje fakt, że zdarzenie może mieć niestandardową przestrzeń nazw i może się odpowiednio odwinąć. Działa również dla e.stopPropagation. W tym przypadku może cofnąć wszystko związane z tym zdarzeniem kliknięcia niestandardowego.