2011-06-18 13 views
5

Naprawiono błąd związany z wyzwalaniem zdarzenia keyup przy użyciu jQuery.jQuery wyzwala zdarzenie keyup tylko wtedy, gdy zostało dołączone do jQuery

Oto czysty przykład

http://jsfiddle.net/xQcGM/2/

Po wpisaniu w dowolnym input „s, oboje wydarzenie ogień, ale gdy próbuję go odpalić programowo ($(element).trigger('event')) tylko druga jest wyzwalany , ale oczekuję obu.

Gdzie czegoś brakuje?

UPD I Nie można zmienić zmienić sposób obsługi!

+0

"kiedy próbuję go uruchomić programowo" - co masz na myśli? – Webars

+0

Dobre pytanie. Ale dlaczego mieszacie wasze powiązania zdarzeń? A może to różne pliki skryptów używające różnych sposobów wiązania zdarzeń? –

+0

@Webars programowo = '$ (element) .trigger ('zdarzenie')' – disfated

Odpowiedz

6

Natywny sposób wyzwalania zdarzeń to zadzwonić pod numer dispatchEvent. Niestety ta metoda nie pojawia się nigdzie w jQuery's source. Zgaduję więc, że musisz sam stworzyć obiekty zdarzeń i wysłać je ręcznie.

Oto dłuższa wersja z działającym example.

$('button').click(function() { 
     var myEvent = document.createEvent('KeyboardEvent'); 
     myEvent.initKeyboardEvent('keyup', true, true, null, false, 
           false, false, false, 76, 0); 
     $('input').each(function() { 
      this.dispatchEvent(myEvent); 
     }); 
    }); 

Można również spojrzeć na jQuery simulate plugin, co nieco ułatwia. Oto krótsza wersja z innym działającym example.

$('button').click(function() { 
    $('input').simulate('keyup'); 
}); 
+0

Dzięki, to jasne. Nie jest to konieczne, ale czy mogę w jakiś sposób rozszerzyć funkcjonalność wyzwalacza jQuery, która spowodowałaby wykonanie fałszywego 'KeyboardEvent? – disfated

+0

Nie patrzyłem na źródło wyzwalacza, ale zastąpienie go własnym kodem jest dość "łatwe". Jednak wtedy trzeba by uporać się z problemami normalizacji zdarzenia DOM ze zdarzeniem jQuery, aby upewnić się, że wszystkie inne operacje na zdarzeniach działają normalnie, ustawiając odpowiednie właściwości na obiekcie zdarzenia i zajmując się problemami z wieloma przeglądarkami. Rozwiązanie nie jest tak proste, jak tworzenie wrappera, które bezpośrednio wywołuje zdarzenia DOM, a następnie wywołuje implementację jQuery, ponieważ wtedy to samo zdarzenie zostanie wywołane dwukrotnie - raz dla wszystkich zdarzeń w elemencie i raz dla zdarzeń związanych z jQuery – Anurag

Powiązane problemy