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?
Odpowiedz
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();
}
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.
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
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. –
Teraz ** to ** jest odpowiedzią, której szukałem. Ponieważ to faktycznie odpowiada na moje pytanie, zaakceptuję je, jeśli edytujesz – Hubro
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);
}
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
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.
Mmmm ... http: //stackoverflow.com/questions/4735006/javascript-how-to-enable-stoppropagation – elclanrs
Gdyby nie było takiego obiektu, nie będzie trzeba tuzina instrukcje warunkowe, aby zdecydować, czy powinien przywołać to? – Jon
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