2013-07-09 9 views
5

Ich habe kürzlich JQuery auf Version 1.9 aktualisiert. In Version 1.4 habe ich so etwas gemacht:Wie kann ich alle Fensterereignisse in JQuery 1.9 erhalten?

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

Natürlich wurde diese Fähigkeit in jQuery 1.8 entfernt. Nach einigen Recherchen fand ich einen Vorschlag, um diesen für immer:

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

Aber nach der Konsole ist Window nicht definiert. Was mache ich falsch? Irgendwelche anderen Vorschläge?

Vielen Dank im Voraus :)

+0

Funktioniert $ '(window) .data ('__ events __');'? – tymeJV

+2

Ich würde keinen Code schreiben, der auf undokumentierten Funktionen beruht, wie Event-Handler an einem bestimmten Ort gespeichert werden. –

+0

Haben Sie irgendwelche Handler an das Fenster gebunden? –

Antwort

0

Sie sind immer noch an der gleichen Stelle gespeichert. Aber es speichert nur Ereignisse, die gebunden wurden, und erst nachdem mindestens eins gebunden ist (, sonst data() wird undefined zurückgeben).

So werden Sie für mich ändern, um Ihren Zustand

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

scheint mit $._data zu arbeiten, wenn der Ereignishandler gebunden ist:

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

Ich landete ein einschließlich Überprüfen Sie, ob windowEvents definiert wurde. Zusätzlich habe ich bei der Frage nach den Ereignissen die [0] eingefügt (diese Lösung wurde hier gefunden: jQuery 1.8 find event handlers). Der endgültige Code sieht also folgendermaßen aus:

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

Dies funktioniert jetzt wie vor dem Upgrade. Danke für Ihre Hilfe!

+2

Das ist großartig, aber Sie sollten das Fenster nicht wirklich in jQuery umwandeln, nur um das native Fenster mit '[0]' zurück zu bekommen, machen Sie einfach ein Fenster, wie in meinem Beispiel, das genau das selbe tut wie Ihr Code, nur sauberer. – adeneo

1

fand ich Lösung auf http://dbj.org/dbj/2013/04/09/list-of-jquery-events/

es ist Basis ist:

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

nennen es zu benutzen Sie einfach:

jQuery.events("div"); 

Wo div ist Platz für jede jQuery-Selektor. Ich habe es auf jQuery 1.9 versucht und es funktioniert sehr gut für mich.

Verwandte Themen