2012-05-07 3 views
5

Piszę skrypt, w którym chciałbym obsługiwać zdarzenia myszy, tylko jeśli wcześniej nie były obsługiwane przez żaden inny element.Obsługa zdarzeń JavaScript nie obsługiwanych przez inne elementy

Mogę dołączyć detektor zdarzeń do obiektu dokumentu, ale wszystkie zdarzenia będą odbierane niezależnie od tego, czy zostały już obsłużone.

Nie mam żadnej kontroli nad elementami na stronie HTML, więc nie mogę ręcznie zatrzymaćPropagacji() podczas obsługi zdarzenia.

Wszelkie pomysły?

+1

W jaki sposób zdarzenia kliknięcia, które nie są kontrolowane, są powiązane? –

+0

Nie mogę tak naprawdę wiedzieć, ponieważ jest to część biblioteki, która może być używana z różnymi rodzajami stron. Może to być addEventListener lub onXXX. – Grodriguez

+1

Tak, 'addEventListener' sprawia, że ​​jest trudniej. W przypadku typów on [event] możesz mieć to, aby twój przewodnik związany z dokumentem zaczynał od 'e.target' i przetestował go i jego przodków, aby zobaczyć, który z nich miał program obsługi, a następnie zawinął go funkcją, która wywołuje 'stopPropagation'. Ale 'addEventListener' nie pozwoli ci tego zrobić. –

Odpowiedz

1

z tego artykułu here.

Wygląda na to, że nie można jeszcze tego zrobić.

Które programy obsługi zdarzeń są zarejestrowane?

Jednym z problemów związanych z obecną implementacją rejestracji zdarzeń W3C jest to, że nie można stwierdzić, czy jakiekolwiek programy do obsługi zdarzeń są już zarejestrowane w elemencie jako . W tradycyjnym modelu można zrobić:

alert(element.onclick)

i widzisz funkcji, który jest zarejestrowany na go lub niezdefiniowany, jeśli nic nie zostanie zarejestrowany. Tylko w jego bardzo niedawno DOM Level 3 Events W3C dodaje

eventListenerList

przechowywać listę imprezy Wozy, które są aktualnie zarejestrowane na elemencie. Ta funkcja nie jest jeszcze obsługiwana przez żadną przeglądarkę, jest zbyt nowa. Jednak problem został rozwiązany.

szczęście

removeEventListener() 

nie daje żadnych błędów, jeśli zdarzenie słuchacz chcesz usunąć nie została dodana do elementu, więc kiedy wątpliwości zawsze można użyć removeEventListener ().

+0

OK .. (chociaż tak naprawdę nie potrzebuję listy słuchaczy). Zobaczmy, czy mogę znaleźć inny sposób. – Grodriguez

1

Możesz więc osiągnąć coś, czego chcesz w pewnych okolicznościach. W szczególności, jeśli

  • Można załadować swój własny JavaScript przed pierwotnym
  • wiedzieć, które elementy słuchania innych, by rzucać wydarzeń na

skutecznie, co możesz zrobić, to zastąpić oryginał Metoda addEventListener na elemencie docelowym z niestandardową, która przechwytuje wywołanie, wykonuje specjalne przetwarzanie, a następnie pozwala kontynuować za normalne. To "specjalne przetwarzanie" to nowa funkcja, która owija pierwotne wywołanie zwrotne i zaznacza pewne argumenty o zdarzeniach, aby poinformować cię, że ktoś już zaaranżował to wydarzenie. Oto dowód koncepcji (z jsFiddle)

docelowa HTML:

<div id='asdf'>asdf</div>​ 

JavaScript:

var target = document.getElementById('asdf'); 
var original = target.addEventListener; 

var updated = function(){ 
    // Grab the original callback, so we can use it in our wrapper 
    var originalFunc = arguments[1]; 

    // Create new function for the callback, that lets us set a state letting us know it has been handled by someone 
    // Finish the callback by executing the original callback 
    var newFunc = function(e){ 
     console.log('haha, intercepted you'); 
     e.intercepted = true; 
     originalFunc.call(this, e); 
    }; 

    // Set the new function in place in the original arguments 'array' 
    arguments[1] = newFunc; 

    // Perform the standard addEventListener logic with our new wrapper function 
    original.apply(this, arguments); 
}; 

// Set the addEventListener on our target to our modified version 
target.addEventListener = updated; 

// Standard event handling 
target.addEventListener('click', function(e){ 
    console.log('original click'); 
    console.log('intercepted?', e.intercepted); 
}) 
+0

To jest ciekawy pomysł. Mogę zapewnić, że mój JS będzie działał przed oryginałem. Jednak nie mam sposobu, aby dowiedzieć się, które elementy dodadzą detektor zdarzeń. Czy jest jakiś sposób, aby to zrobić, ale w sposób globalny? (globalnie zastępując kod addEventListener zmodyfikowaną wersją) – Grodriguez