我試圖創建我自己的使用jQuery插件,可以用來設置使用單個命令這樣的jQuery移動對話框的處理程序避免jQuery Mobile的內存泄漏:$('#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不起作用)。
任何想法如何避免事件積累(也許清理代碼)?
這不是真的很重要,因爲你沒有對'submit'事件處理函數的返回值做任何事情,但是如果你返回'e.preventDefault()'它實際上並不返回任何東西。 – Jasper