0

私が働いているネットワーク全体でフォームを検証するためのプラグインを作成しました。ここでの問題は、一部のページに複数のフォームがあり、グローバル変数が上書きされることです。できる限り例を挙げてみます。コード自体は貼り付けるには長すぎます。

このコードがひどく間違っていることはわかっていますが、複雑になりすぎないように、このコードの複数のインスタンスを使用して達成するための最良の方法を評価しようとしています。

jquery プラグイン:

(function($){

    methods = { 
        'method1': function(){
            alert('form: ' + globals.form_name ); 
        }
    }

    $.fn.validationplugin = function() {
        globals.form_id = $(this).attr('id');
    }(jQuery);

    var globals = {}


}(jQuery);

html 呼び出し:

<form id="form1"></form>
<form id="form2"></form>

<script type="text/javascript">
    $('#form1').validationplugin();
    $('#form2').validationplugin();
</script>
4

3 に答える 3

3

フォーム ID には配列を使用します。

var globals = {
  form_id: []
};

プラグインは単一の要素または複数の要素で呼び出すことができるため、各要素の ID を取得する必要があります。thisプラグインをチェーンできるように、関数からも戻ります。(jQuery)また、関数を呼び出して戻り値をプラグインとして割り当てるため、最後には必要ありません。

$.fn.validationplugin = function() {
  return this.each(function(i, el){
    globals.form_id.push($(el).attr('id'));
  });
};

呼び出しに複数の要素がある場合にも機能するようになりました。

$('#form1,#form2').validationplugin();

ID の代わりに要素への参照を使用できるかどうかを検討してください。ID のないフォームでも機能します。

于 2012-08-27T20:24:25.293 に答える
0

こんな感じでやってしまいました…。

$.fn.validate = function(){

    var formnametest = $(this).attr('id');

    if( !($.validate.globals[ formnametest ]) ){
        globals(formnametest);
    }
}

function globals(formnametemp){
    $.validate.globals[ formnametemp ]  = {
        'mobile': false,
        'mobileoffset': -115,
        'bubbleanimationtime': 500,
        'bindblur': true,
        'zindex': null
    }
}

$.validate = { 
    globals:{}
};

デフォルトのグローバル変数の新しいインスタンスを追加し、フォームと同じ名前を付ける関数 globals() を作成しました。唯一の結果は、現在のフォームの名前をすべての関数に渡さなければならなかったことです。これは回避しようとしていましたが、すべて問題ありません。ありがとう@Guffa、あなたの意見は物事を大局的に捉えるのに役立ちました。

後でこれらのグローバル変数を参照するには、次のようにします: $.validate.globals[ currentform ].propertynamehere

長ったらしく見えますが、まさに私が必要としていた結果でした。:)

于 2012-08-28T17:53:56.133 に答える
-1

同じ要素に対してプラグインを複数回呼び出し、それらの呼び出し間でデータを関連付けたいと想定しています。そうでない場合は、「グローバル」はまったく必要ありません。@Felix Kling がコメントで述べているように、代わりにローカル変数を使用してください。

しかし、プラグインへの複数の呼び出し間で永続化できるデータを追跡する必要がある場合は、次のように実行できます。

(function($){

    var globals=[],
        instances=[];

    $.fn.validationplugin = function() {
        this.each(function() {
            var current,
                index = $.inArray(this,instances));

            if (index!==-1) {
                current = globals[index];
            } else {
                instances.push(this);
                current = {};
                globals.push(current);
            }
            current.form_id = $(this).attr('id');
            ... 
        }
    };
}(jQuery);

これにより、プラグインに渡された各 DOM 要素に関連付けられたオブジェクトがキャッシュされます。同じ要素のプラグインに対して後続の呼び出しが行われると、その後続の呼び出しで同じグローバル オブジェクトが使用されます。

jquerydataを使用して任意の DOM 要素にデータを関連付けることもできますが、自分でキャッシュするよりも効率が悪い場合があります。

于 2012-08-27T20:27:22.430 に答える