1

この質問を二重に投稿した場合は、申し訳ありません。プロフィールで尋ねた質問の下にポップアップが表示されなかったので、実際には投稿されていないと考えました. ともかく。このコードのメイン ロジックはスタック オーバーフローのどこかにあり、自分用に変更しました (どこで見つけたか思い出せません)。このコードは意図したとおりに機能していますが、スケーラビリティの問題により、これを形式の標準関数に変換したいと考えています。 function serializeObject(form_name){...}jQuery がなく、括弧でカプセル化されていないため、この関数を別の JavaScript ファイルに移動して、サイトの複数のページの複数のフォームで使用できます。これを行う方法はありますか?基本的に、フォーム名をパラメーターとして取り、そのフォームを操作できる必要があります。現在カプセル化されているため、それを呼び出す関数と同じファイルにある場合にのみ機能します。このコードは何度も繰り返されるため、これはひどい習慣ですが、私が見る限り、JS を分解する唯一の方法は、すべてのファイルでこの関数を書き直すことです。

   (function($) {
        $.fn.serializeObject = function() {
            var self = this,
            json = {},
            push_counters = {},
            patterns = {
                "validate": /^[a-zA-Z][a-zA-Z0-9_]*(?:\[(?:\d*|[a-zA-Z0-9_]+)\])*$/,
                "key":      /[a-zA-Z0-9_]+|(?=\[\])/,
                "push":     /^$/,
                "fixed":    /^\d+$/,
                "named":    /^[a-zA-Z0-9_]+$/
            };
            this.build = function(base, key, value) {
                base[key] = value;
                return base;
            };
            this.push_counter = function(key) {
                if(push_counters[key] === undefined) {
                    push_counters[key] = 0;
                }
                return push_counters[key]++;
            };
            $.each($(this).serializeArray(), function() {
                // skip invalid keys
                if(!patterns.validate.test(this.name)) {
                    return;
                }
                var k,
                keys = this.name.match(patterns.key),
                merge = this.value,
                reverse_key = this.name;
                while((k = keys.pop()) !== undefined) {
                    // adjust reverse_key
                    reverse_key = reverse_key.replace(new RegExp("\\[" + k + "\\]$"), '');
                    // push
                    if(k.match(patterns.push)) {
                        merge = self.build([], self.push_counter(reverse_key), merge);
                    }
                    // fixed
                    else if(k.match(patterns.fixed)) {
                        merge = self.build([], k, merge);
                    }
                    // named
                    else if(k.match(patterns.named)) {
                        merge = self.build({}, k, merge);
                    }
                }
                json = $.extend(true, json, merge);
            });
        return json;
        };
    })(jQuery);

そして、それはで呼び出されます

var datObj = $(frm).serializeObject()

しかし、これは何度も起こります。この関数を一度だけ記述し、必要に応じて複数の個別のファイルから呼び出すことができるようにしたいのですが、おそらく反応のようなモジュールを作成するためのステップとして。何か案は?

4

1 に答える 1

1

ここでの ibrahim mahrir のコメントは、正しいことが判明したアイデアを私に与えてくれました。このファイルと jQuery の順序ではなく、このファイルと他のカスタム js ファイルの順序です。すべてのカスタム JS スクリプトをこのファイルの後にロードするように移動することで、問題は解決しました。

于 2018-05-10T15:11:31.480 に答える