Я пытаюсь создать плагин jQuery для собственного использования, который можно использовать для настройки обработчика для мобильных диалогов jQuery с помощью одной команды: $('#dialog').setup_dialog({ callback: callback_function });
Однако мой обработчик имеет довольноочевидная утечка памяти из-за замыканий в нем:
$.fn.setup_dialog = function( options ) {
var settings = $.extend({
callback : 0
}, options);
var that = this;
return this.live('pagebeforeshow', function(event, ui) {
console.log("outside");
$('form', that).submit( function(e) {
var $inputs = $('form :input', that); // get all form inputs
var values = {};
$inputs.each(function() {
values[this.name] = $(this).val();
});
that.dialog('close');
if ( settings.callback && typeof(settings.callback) === "function" ) {
$('#'+ui.prevPage[0].id).live('pagebeforeshow', function() {
settings.callback(values, that);
console.log("inside");
});
}
return e.preventDefault();
});
});
}; /* setup_dialog */
Если вы запустите приведенный выше код, вы увидите, что «изнутри» и «снаружи» напечатаны сначала один раз, затем три раза (дважды с одной отправки),затем шесть раз (три раза от одной отправки) и т. д.
Целью кода является присоединение обработчика событий к диалоговому окну jQuery Mobile, когда он появляется, который перехватит отправку формы, соберет всю формузначения, а затем передать их в функцию обратного вызова, которая изменит исходную страницу (которая запустила диалоговое окно).
Обратите внимание, что из-за того, что jQuery Mobile использует AJAX для переключения между страницами, мне нужно использовать .liveсвязать события (.bind или .one не будет работать).
Есть идеи, как мне избежать накопления событий (и, возможно, немного очистить код)?