2013-07-09 4 views
5

Я недавно обновил JQuery до версии 1.9. В версии 1.4 я делал что-то вроде этого:Как я могу получить все события окна в JQuery 1.9?

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

Конечно, в jQuery 1.8 эта способность была удалена. После некоторого исследования я нашел предложение для получения вокруг этого:

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

Но, в соответствии с консолью, windowEvents не определено. Что я делаю не так? Любые другие предложения?

Спасибо заранее :)

+0

Это работает '$ (window) .data ('__ events __');'? – tymeJV

+2

Я бы не писал код, который полагался на недокументированные функции, такие как обработчики событий, хранящиеся в определенном месте. –

+0

Вы связали каких-либо обработчиков с окном? –

ответ

0

Они до сих пор хранятся в одном месте. Но в нем хранятся только события, которые были связаны, и только после того, как по крайней мере один связан (иначе data() вернет undefined).

Таким образом, вы должны изменить ваше состояние

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

Кажется, работает для меня с $._data, если обработчик события связан:

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

Я в конечном итоге, включающий в себя проверьте, не определено ли windowEvents. Кроме того, я включил [0] при запросе событий (это решение было найдено здесь: jQuery 1.8 find event handlers). Таким образом, окончательный код выглядит так:

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

Это работает так же, как и до обновления. Спасибо за вашу помощь!

+2

Это здорово, но вы действительно не должны обертывать окно в jQuery, чтобы вернуть собственное окно с помощью '[0]', просто сделайте окно, как в моем примере, которое точно так же, как ваш код, только очистит. – adeneo

1

Я нашел решение на http://dbj.org/dbj/2013/04/09/list-of-jquery-events/

это база:

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

Чтобы использовать это просто позвонить:

jQuery.events("div"); 

Где ДИВ это место для любого селектора JQuery. Я пробовал это на jQuery 1.9, и он отлично работает для меня.

Смежные вопросы