我正在寻找最佳实践建议。
我正在编写一个小的 jQuery 插件来管理元素的水平滚动。
我需要该插件针对的所有 dom 元素来更新窗口调整大小。
事实是,我的网站是一个完整的 ajax “应用程序”,所以当我删除 DOM 元素时,我需要它们消失,这样内存就不会泄漏。
但是我找不到在不保留对 DOM 节点的引用的情况下绑定 resize 事件的方法。
编辑 :
实际上,我需要调整大小处理程序来在“调用”时获取以插件为目标的元素,因为我不想在内存中保留对这些元素的任何引用,因为我可能会在他们的父级上调用 .html('') ...
我没有粘贴我所有的代码,只是一个空壳。我已经有一个取消绑定处理程序的销毁方法。但是我正在动态生成、删除和附加 html 节点,并且我将插件所针对的元素以静默方式删除。
Kevin B 表示我可以重写 jQuery.remove
方法来处理处理程序,但必须加载 jQuery UI 才能使其工作。我也不想这样。。
这是我尝试过的(尝试评论):
(function($) {
// SOLUTION 2 (see below too)
// Not good either coz elements are not removed until resize is triggered
/*
var hScrolls = $([]);
$(window).bind('resize.hScroll',function(){
if(!hScrolls.length) return;
hScrolls.each(function(){
if($(this).data('hScroll')) $(this).hScroll('updateDimensions');
else hScrolls = hScrolls.not($(this));
});
});
*/
// END SOLUTION 2
// SOLUTION 3 (not implemented but I think I'm on the right path)
$(window).bind('resize.hScroll',function(){
// need to get hScroll'ed elements via selector...
$('[data-hScroll]').hScroll('updateDimensions');
// I don't know how....
});
// END SOLUTION 3
var methods = {
init : function(options) {
var settings = $.extend( {
defaults: true
}, options);
return this.each(function() {
var $this = $(this),
data = $this.data('hScroll');
if (!data) {
$this.data('hScroll', {
target: $this
});
// SOLUTION 1
// This is not good: it keeps a reference to $this when I remove it...
/*
$(window).bind('resize.hScroll', function(){
$this.hScroll('updateDimensions');
});
*/
// END SOLUTION 1
$this.hScroll('updateDimensions');
// SOLUTION 2 (see above too)
hScrolls = hScrolls.add(this);
}
});
},
updateDimensions: function(){
var hScroll = this.data('hScroll');
// do stuff with hScroll.target
}
}
$.fn.hScroll = function(method) {
if (methods[method]) {
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
} else if ( typeof method === 'object' || !method) {
return methods.init.apply(this, arguments);
} else {
$.error('Method ' + method + ' does not exist on jQuery.hScroll');
}
};
})(jQuery);
提前谢谢大家!