2011-01-19 13 views
14

Dzięki object.stopPropagation() mogę zatrzymać bulgotanie zdarzeń, ale jak mogę je ponownie włączyć?Javascript: Jak włączyć stopPropagation?

Czy w js jest zdefiniowana funkcja podobna do object.startPropagation?

EDIT:

Problem polega na tym, że JS pamięta, jeśli klikniesz na „obiekt”, niż zatrzymać Event bubbling zawsze, nawet po tym, jak nie chcą, więc chciałbym go zatrzymać:

document.getElementById("object").onclick = function(e){ 
    if(e && e.stopPropagation) { 
     e.stopPropagation(); 
    } else { 
      e = window.event; 
      e.cancelBubble = true; 
    } 
} 
+0

Czy możesz dodać więcej informacji, np. Co próbujesz osiągnąć. Nie widzę potrzeby, aby kiedykolwiek trzeba było go uruchomić, jeśli zadzwoniłeś do stop. – GenericTypeTea

+0

Edytowałem pytanie @GenericTypeTea – Adam

+0

Kiedy mówisz "nawet gdy nie chcę tego", w jakich okolicznościach nie chcesz tego? Musisz ustawić jakąś zmienną, aby przedstawić te okoliczności, a następnie sprawdź tę zmienną w module obsługi. Byłoby pomocne, gdybyś opublikował swój kod, zamiast wybierać inne rozwiązanie. – Kelvin

Odpowiedz

25

Nie pamięta w ogóle wartości. Zdarzenie e jest nowe za każdym razem, gdy zostanie uruchomione onclick. Problemem jest to, że jesteś zawsze anulowanie pęcherzyków zdarzeń:

if(foo) { 
    e.stopPropagation(); 
} else { 
    e.cancelBubble = true; 
} 
  • e.stopPropagation jest metoda W3C zapobiegania zdarzenie propagacji.
  • e.cancelBubble to metoda firmy Microsoft , która zapobiega bulgotaniu zdarzeń.

Obie są takie same. Więc za każdym razem anulujesz bulgotanie wydarzeń. Więcej czytania here.

Musisz zmienić swój sposób tak, że tylko anuluje propagacji jeżeli spełnione są twoje kryteria:

document.getElementById("object").onclick = function(e) { 

    if(e && e.stopPropagation && someCriteriaToStopBubbling === true) 
    { 
     e.stopPropagation(); 
    } 
    else if (someCriteriaToStopBubbling === true) 
    { 
      e = window.event; 
      e.cancelBubble = true; 
    } 
} 

UPDATE: Należy pamiętać, że w bieżącym kodu if (e && e.stopPropagation) będzie zawsze prawdziwe jeśli przeglądarka obsługuje stopPropagation. Jeśli przejdzie do drugiego nawiasu dla cancelBubble, nie zapamięta wartości ostatnio ustawionej. Zobacz this fiddle.

Zasadniczo podsumowując, w swoim kodzie anulujesz propagację za każdym razem po każdym kliknięciu. Musisz dodać do funkcji pewne kryteria, aby określić, czy anulować propagację w górę hierarchii elementów.

+0

Przetestowałem to i zapamiętałem, że likwidacja bąbelków zdarzeń znajduje się w funkcji, która jest uruchamiana przez inne zdarzenie. A kiedy klikam na inny obiekt, bulgotanie zdarzeń jest nadal anulowane, a także umieszczam alert wewnątrz funkcji i działa, ponieważ pamięta, że ​​kliknięcie "obiektu" powoduje uruchomienie funkcji, ale nie uruchomiłem funkcji nadrzędnej. funkcja funkcji bulgotania zdarzeń, może nie rozumiem czegoś, ale to właśnie tutaj doświadczam :). Ale twoje rozwiązanie jest poprawne Mogę umieścić tam pewne instrukcje IF ELSE i mam nadzieję, że to zadziała :) – Adam

+0

@CIRK - Robisz coś źle, ponieważ to ** nie ** pamiętaj, chyba że robisz jakiś kod inny do tego, co podałeś. Zobacz tutaj: http://jsfiddle.net/DgwSA/. Za każdym kliknięciem przycisku w tym przykładzie cancelBubble zawsze będzie fałszywe. Dodałem aktualizację, aby spróbować uczynić Twoje błędy bardziej oczywistymi. – GenericTypeTea

+0

Sprawdź to -> http://jsfiddle.net/DgwSA/1/ Onclick został zmieniony, a także anuluj dymek, jednak jeśli ostrzeżesz e.cancelbubble, otrzymasz fałszywe, ale w moim projekcie również zatrzymałem obsługę zdarzeń. – Adam