-3

関数がいつでも存在することを確認するように設計された以下のコードがあります。 このコードには現在エラーはありません。私のjavascriptファイルは任意の順序でロードされ、プロジェクトがそのように行われるために必要なので、私はこれを使用しています。私のjavascriptファイルはそれらの間で関数を実行するために分離されているので、それらをグローバル変数に保存し、グローバル変数からその関数を呼び出す必要があります。

Javascript ファイルの例: "checker.js" // 関数が存在するかどうかをチェックします

       var funcList = {};
       $(document).ready(function(){
            funcList.requireJS =
            function requireJS(requires,callback){
                console.log("requireJS Starting With Requires Below:");
                console.log(requires);
                var attempts = 0;

                attemptRequire();

                function attemptRequire(){
                    $.each(requires, function (key, value){
                        attempts++;
                        console.log("Checking:"+value+" attempts="+attempts);
                        if (typeof eval(value) !== 'undefined'){
                            callback(); //them run the function
                        }else{
                            console.log("require JS waiting...");
                            setTimeout(function(){attemptRequire();}, 100);//wait and try again every 100 milliseconds.
                        }
                    });
                }

                console.log("requireJS Finished!...");
            };
        });

グローバル関数の使用例:sample.js

$(document).ready(function(){
    console.log("Quote.Js Loading...");

    requires = {
        0 : "$.fn.mask"
    };

    funcList["requireJS"](requires, function(){
        $("#partone_phone").mask("(999) 999-9999? x99999");
        console.log("Quote.Js Loaded!");
    });

});

jQuery の「マスキング」用のプラグインがまだロードされていない場合、コードの実行は試行されませんが、ロードされると実行されます。プラグインがロードされていないときに .mask を実行しようとすると、フィールドが期待どおりに機能しなくなります。例として jquery.mask を使用していますが、これは何にでも当てはまります。

ただし、jquery関数としてそれを参照する唯一の方法は $.fn.mask であると思われるため、jquery.maskを使用しています

通常、関数は次のように言ってテストできますが、これは機能しtypeof functionNameHere !== 'undefined'ますが、これは jquery 関数であるため、文字列 '$.fn.mask' を送信すると、その周りに eval() を配置しない限り機能しません...すべてが悪い形であることを知っています!

これを機能させるために eval() を使用するより良い代替手段はありますか?

また、注意:

requires = {
        0 : $.fn.mask
    };

文字列なしで関数を直接送信しようとしても機能しません。未定義の場合、requireJS に移動するまで未定義のままになるためです。

4

4 に答える 4

2

代わりに、探しているメソッドまたは false を返す代わりに、実行する関数を渡すことをお勧めします。

requires = {
    0 : function () {
        return $ && $.fn && $.fn.mask;
    }
};

あとは、 を呼び出してが定義されているrequires[0]()かどうかを確認するだけです。$.fn.mask


補足: これを "requireJS" として参照すると、将来の開発者が混乱する可能性があります。これはrequireJSではなく、スクリプトの読み込みが完了したかどうかを確認するための独自の関数にすぎないためです。requireJS はモジュール ローダーであり、これを使用すればこの問題を軽減する可能性があります。

于 2015-06-03T18:20:15.177 に答える