2011-05-27 12 views
16

Na mojej stronie mam wiele różnych elementów, które reagują na zdarzenia kliknięć. Są sytuacje, w których muszę zablokować wszystkie kliknięcia na podstawie niektórych flag globalnych. Czy istnieje sposób, w jaki mogę dokonać tego sprawdzenia w scentralizowanej lokalizacji?jQuery: Zatrzymaj wszystkie zdarzenia kliknięcia, zanim się to stanie?

Teraz w sprawdzasz za flagą, na przykład każdego zdarzenia:

var canClick = false; // Global flag 

// Sample click event: 
$("#someDiv").click(function(){ 
    if(!canClick) return; 

    // Some stuff ... 
}); 

Co chciałbym zrobić, to mieć jeden element, który pułapki wszystkich zdarzeń kliknij przed innych elementów.

Próbowałem zrobić to na dokumencie, ale te zdarzenia występują tylko po innych zdarzeniach kliknięcia.

Przykład:

$("#someDiv").click(function(){ console.log("someDiv click"); }); 

$(document).click(function(){ console.log("Document click"); }); 

// When I click on the someDiv element it prints: 
> someDiv click 
> Document click 

Próbowałem też wprowadzenie pełnego div ekranu na szczycie wszystko i za pomocą tego do wydarzeń pułapki, ale problemem było, że żaden z kliknięć były propagowane przez ten pełni div ekranu. Nie chcę też polegać na tworzeniu dodatkowych elementów do pułapkowania kliknięć, ponieważ wydaje się to trochę hackowate.

Czy mogę zastąpić funkcję kliknięcia jQuery, aby móc umieścić tam moje małe sprawdzenie?

Czy jest coś oczywistego, czego tu brakuje?

Dzięki za pomoc.

Odpowiedz

22

Tak, użyj .addEventListener() i ustaw trzecią opcję na true. Spowoduje to powiązanie słuchacza z fazą przechwytywania i wykonanie tej funkcji, zanim cokolwiek zostanie wykonane.

Oto przykład, gdzie będzie zatrzymać wszystkie programy obsługi kliknięcia z wykonaniem:

document.addEventListener('click', function(e) { 
    e.stopPropagation(); 
}, true); 

Zobacz go w akcji tutaj:

http://jsfiddle.net/wLwMh/1/

+0

Ahh genialny! Dziękuję bardzo, proszę pana. Działa w przeglądarce Chrome 11, jest to jedyna przeglądarka, której potrzebuję, aby była kompatybilna. Twoje zdrowie. – nebs

+4

Dla każdego, kto potrzebuje zgodności z różnymi przeglądarkami, nie jest to obsługiwane przez IE <9 – opsb

0

Można przechwytywać wszystkie zdarzenia kliknięcia następnie wywołać zdarzenia niestandardowego gdzie masz słuchaczy związany po czeku

$("#someDiv").bind('awesomeEvent', function() { 
    //do stuff here 
} 

$(*).click(function() { 
    if(canClick) { 
     $(this).trigger('awesomeEvent'); 
    } 
} 

EDIT należy wspomnieć, że przy użyciu $ (*) selektor nie jest dobrym pomysłem z punktu widzenia wydajności. Powinieneś naprawdę spróbować i jakoś zawęzić zakres.

Powiązane problemy