2013-07-09 12 views
5

Niedawno zaktualizowałem JQuery do wersji 1.9. W wersji 1.4 robiłem coś takiego:Jak mogę uzyskać wszystkie zdarzenia okna w JQuery 1.9?

 var windowEvents = $(window).data("events"); 
    if (windowEvents.unload.length > 0) { 
      // some fun stuff 
    } 

Oczywiście w jQuery 1.8 ta zdolność została usunięta. Po niektórych badań, znalazłem sugestię do poruszania się w ten sposób:

 var windowEvents = $._data($(window), "events"); 

Ale według konsoli windowEvents jest niezdefiniowany. Co ja robię źle? Jakieś inne sugestie?

Z góry Z góry :)

+0

Czy to działa '$ (window) .data ('__ events __');'? – tymeJV

+2

Nie napisałbym kodu, który opiera się na nieudokumentowanych funkcjach, takich jak obsługa zdarzeń przechowywana w konkretnej lokalizacji. –

+0

Czy przywiązałeś dowolne procedury obsługi do okna? –

Odpowiedz

0

Są one nadal przechowywane w tym samym miejscu. Ale przechowuje tylko zdarzenia, które zostały powiązane i dopiero po związaniu co najmniej jednego (w przeciwnym razie data() zwróci undefined).

Więc trzeba będzie zmienić twój stan

var windowEvents = $(window).data("events") || {}; 
if (windowEvents.unload && windowEvents.unload.length > 0) { 
     // some fun stuff 
} 
3

wydaje się działać dla mnie $._data czy obsługi zdarzeń jest zobowiązany:

$(window).on('unload', function() { 
    // do stuff 
}); 

if (($._data(window, 'events').unload || []).length) { 
    console.log('unload is bound'); 
}else{ 
    console.log('unload is NOT bound'); 
} 

FIDDLE

1

skończyło się w tym sprawdź, czy zdefiniowano windowEvents. Ponadto włączyłem [0], gdy pytam o zdarzenia (to rozwiązanie zostało znalezione tutaj: jQuery 1.8 find event handlers). Tak więc ostateczny kod wygląda następująco:

var windowEvents = $._data($(window)[0], "events"); 
if (windowEvents && windowEvents.unload.length > 0) { 
    // some fun stuff 
} 

To teraz działa tak jak przed uaktualnieniem. Dzięki za pomoc!

+2

To świetnie, ale naprawdę nie powinieneś zawijać okna w jQuery tylko po to, by przywrócić okno rodzime z '[0]', po prostu wykonaj okno, jak w moim przykładzie, które robi dokładnie to samo, co twój kod, tylko czyściej. – adeneo

1

znalazłem rozwiązanie na http://dbj.org/dbj/2013/04/09/list-of-jquery-events/

to podstawa jest:

/* (c) 2013 by DBJ.ORG, GPL/MIT applies */ 
jQuery.events = function (expr) { 
    var rez = [], evo ; 
    jQuery(expr).each(
     function() { 
     if (evo = jQuery._data(this, "events")) 
      rez.push({ element: this, events: evo }) ; 
    }); 
return rez.length > 0 ? rez : null ; 
} 

go użyć po prostu zadzwoń:

jQuery.events("div"); 

div Gdzie jest miejsce dla każdego selektora jQuery. Próbowałem go na jQuery 1.9 i działa bardzo dobrze dla mnie.

Powiązane problemy