ベストプラクティスのアドバイスを探しています。
要素の水平スクロールを管理する小さな jQuery プラグインを作成しています。
ウィンドウのサイズ変更時に更新するには、そのプラグインの対象となるすべての dom 要素が必要です。
実際、私のウェブサイトは完全な ajax 'アプリ' であるため、DOM 要素を削除するときは、メモリ リークを防ぐために削除する必要があります。
しかし、DOM ノードへの参照を保持せずにサイズ変更イベントをバインドする方法が見つかりません。
編集 :
実際には、「呼び出し」時にプラグインをターゲットとする要素を取得するためにサイズ変更ハンドラーが必要です。これらの要素への参照をメモリに保持したくないので、それらの要素の親で .html('') を呼び出す可能性があるためです。 ...
すべてのコードを貼り付けたのではなく、空のシェルだけを貼り付けました。ハンドラーのバインドを解除する destroy メソッドが既にあります。しかし、HTML ノードを動的に生成、削除、および追加しています。プラグインの対象となる要素をサイレント モードで削除します。
Kevin B は.remove
、ハンドラーを処理するために jQuery メソッドをオーバーライドできるが、機能させるには 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);
よろしくお願いします!