2012-08-15 6 views
35

Poszukuję prostego i abstrakcyjnego sposobu klonowania lub ponownego wysyłania zdarzeń DOM. Nie jestem zainteresowany klonowaniem węzłów DOM.Jak klonować lub ponownie wysyłać zdarzenia DOM?

Eksperymentowałem trochę, przeczytałem DOM Events specification i nie znalazłem jednoznacznej odpowiedzi.

Idealnie szukam czegoś tak prosta jak:

handler = function(e){ 
    document.getElementById("decoy").dispatchEvent(e) 
} 
document.getElementById("source").addEventListener("click", handler) 

Ten przykładowy kod, oczywiście, nie działa. Jest wyjątek DOM stwierdzający, że zdarzenie jest aktualnie wysyłane - oczywiście.

Chciałbym uniknąć ręcznego tworzenia nowych zdarzeń za pomocą document.createEvent(), inicjując je i wysyłając.

Czy istnieje proste rozwiązanie tego przypadku użycia?

+0

Dlaczego trzeba odesłaniu wydarzenia? – josh3736

+0

Potrzebuję tego jako rozwiązania tymczasowego dla regionów CSS, które obecnie nie wysyłają zdarzeń węzła podrzędnego. Regiony renderują tylko zawartość węzła podrzędnego, nie działają jako węzły nadrzędne. –

Odpowiedz

63

wiem, kwestia jest stary, a PO chciała uniknąć tworzenia/inicjowanie podejście, ale jest to stosunkowo prosty sposób odtworzyć wydarzenia:

new_event = new MouseEvent(old_event.type, old_event) 

Jeśli chcesz więcej niż tylko zdarzenia myszy, można zrobić coś takiego:

new_event = new old_event.constructor(old_event.type, old_event) 

A w oryginalnym kontekście:

handler = function(e) { 
    new_e = new e.constructor(e.type, e); 
    document.getElementById("decoy").dispatchEvent(new_e); 
} 
document.getElementById("source").addEventListener("click", handler); 

(Dla użytkowników jQuery: Może trzeba użyć e.originalEvent.constructor zamiast e.constructor)

+1

Zauważ, że to działa tylko w nowoczesnych wersjach Firefoksa i Chrome, a nie działa w dowolnej wersji IE –

+3

@Alexis dostaję: '' 'Uncaught TypeError: Illegal constructor''': ( – niieani

+0

@NIXin w którym przeglądarka? – Alexis

-2

Co ze zdarzeniem wyzwalającym?

W twoim przypadku:

$('#decoy').trigger('click') 

albo w czystej JS można go znaleźć w How to trigger event in JavaScript?


UPDATE

Znalazłem drogę przez jQuery:

  1. Wpisane tutaj - jQuery find events handlers registered with an object musisz zdobyć potrzebne wydarzenie. Na przykład: $('#decoy').data('events').click[0].handler;

  2. Teraz możesz uzyskać link do tego programu obsługi. Ale jeśli chcesz stworzyć niezależną kopię obsługi - użyć tego kodu, aby utworzyć kopię Handler:


function clone_obj(obj){ 
    if(obj == null || typeof(obj) != 'object') return obj; 
    var temp = new obj.constructor(); 
    for(var key in obj) temp[key] = clone_obj(obj[key]); 
    return temp; 
} 
+1

Tak, mogę wywołać nowe zdarzenie, ale wymaga to ręcznej konfiguracji jego stanu, aby odzwierciedlić oryginalne wydarzenie. Szukam sposobu, aby DOM obsługiwał klonowanie zdarzenia, w zależności od tego, które z nich jest: kliknij, dotknij itd. –

+0

Dodałem aktualizacja z odpowiedzią – Rustam