magicForm という単純な jQuery プラグインを作成しています (これはばかげていますか?)。今、私が正しく理解していないと思う問題に直面しています。
私のプラグインはコンテナ要素に適用されることになっています。これは、ユーザーが入力すると、各入力が 1 つずつ表示されます。それは私の問題の正確な目的ではありません。コンテナーを初期化するたびに、イベント クリック コールバックを宣言します。例を示しましょう。
(function($){
var methods = {
init: function(options){
return this.each(function(){
var form, inputs;
var settings = {
debug: false
};
settings = $.extend(settings, options);
form = $(this);
$('a.submit', form).on('click', function(event){
if (settings.submitCallback) {
settings.submitCallback.call(form, inputs);
}
return false;
});
});
},
reset: function() {
}
}
$.fn.magicForm = 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.' );
}
};
})($);
私はこのコードの特定の部分に焦点を当てています:
$('a.submit', form).on('click', function(event){
if (settings.submitCallback) {
settings.submitCallback.call(form, inputs);
}
return false;
});
init
メソッドが呼び出されるたびに、その貧弱なコールバックが登録されるためです。
Twitterのブートストラップ「タブ」にネストされた要素でプラグインを呼び出し、ブートストラップモーダルにネストされたとき、これを痛々しく経験していました。ブートストラップモーダルinit
の「表示」イベントがトリガーされるたびに呼び出していました。
だから、これは私が私の方法でそれを修正したinit
方法です:
// Prevent callback cumulation
if (!$(this).data('form_initialized')) {
$('a.submit', form).on('click', function(event){
if (settings.submitCallback) {
settings.submitCallback.call(form, inputs);
}
return false;
});
$(this).data('form_initialized', true);
}
そして、私はこれについて確信が持てません。
お時間をいただきありがとうございます。