2013-07-09 5 views
5

Ho recentemente aggiornato JQuery alla versione 1.9. Sulla versione 1.4, stavo facendo qualcosa di simile:Come posso ottenere tutti gli eventi della finestra in JQuery 1.9?

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

Naturalmente, in jQuery 1.8 è stato rimosso questa capacità. Dopo alcune ricerche, ho trovato un suggerimento per ottenere intorno a questo:

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

Ma, secondo il console, windowEvents è indefinito. Che cosa sto facendo di sbagliato? Qualche altro suggerimento?

Grazie in anticipo :)

+0

Funziona '$ (finestra) .data ('__ eventi __');'? – tymeJV

+2

Non scriverei codice che si basa su funzionalità non documentate, come i gestori di eventi che vengono archiviati in una particolare posizione. –

+0

Hai associato dei gestori alla finestra? –

risposta

0

Sono ancora memorizzati nello stesso posto. Ma memorizza solo gli eventi che sono stati vincolati e solo dopo che almeno uno è vincolato (altrimenti data() restituirà undefined).

Così si dovrà cambiare la sua condizione

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

sembra funzionare per me con $._data se il gestore di eventi è legato:

$(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

ho finito tra cui un controlla per vedere se windowEvents è stato definito. Inoltre ho incluso [0] quando ho richiesto gli eventi (questa soluzione è stata trovata qui: jQuery 1.8 find event handlers). Quindi il codice finale è il seguente:

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

Ora funziona come prima dell'aggiornamento. Grazie per l'aiuto!

+2

È grandioso, ma non dovresti davvero chiudere la finestra di jQuery solo per riavere la finestra nativa con '[0]', basta fare la finestra, come nel mio esempio, che fa esattamente lo stesso del tuo codice, solo più pulito. – adeneo

1

ho trovato la soluzione su http://dbj.org/dbj/2013/04/09/list-of-jquery-events/

sua base è:

/* (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 ; 
} 

Per utilizzarlo basta chiamare:

jQuery.events("div"); 

Dove div è posto per qualsiasi selettore jQuery. L'ho provato su jQuery 1.9 e funziona molto bene per me.

Problemi correlati