2

オプション引数として内部のコールバック関数を受け入れるようにプラグインを設定しようとしています:

(function($) {

    $.fn.MyjQueryPlugin = function(options) {
        var defaults = {
            onEnd: function(e) {}
        };

        var settings = $.extend({}, defaults, options);

        return this.each(function() {
            // do stuff (complete() gets called here)

        });
    };

    function complete(e){
        settings.onEnd.call(this); // <- the error?
    }

})(jQuery);

しかし、call()が未定義であるというエラーが発生します。私のコードの何が問題になっていますか?

わかりました、私はこれを次のように変更しました:

(function($) {

    $.fn.MyjQueryPlugin = function(options) {
        var defaults = {
            onEnd: function(e) {}
        };

        var settings = $.extend({}, defaults, options);

        var complete = function(e){
          settings.onEnd.call(this); // <- the error?
        }


        return this.each(function() {
            // do stuff (complete() gets called here)

        });
    };   

})(jQuery);

そしてエラーはまだそこにあります...

4

3 に答える 3

3

settings定義されている関数の外部を参照しようとしています。settings割り当てた関数内のローカル変数になるようにスコープを設定しましたが$.fn.MyjQueryPlugin、そのローカル変数を閉じない関数からそれを使用しています。

終了するすべての呼び出しに対して新しい関数を作成できます。completeMyjQueryPluginsettings

(function($) {

    $.fn.MyjQueryPlugin = function(options) {
        var defaults = {
            onEnd: function(e) {}
        };

        var settings = $.extend({}, defaults, options);

        return this.each(function() {
            // do stuff (complete() gets called here)

        });

        // `complete` now closes over `settings`
        function complete(e){
            settings.onEnd.call(this); // <- the error?
        }
    };

})(jQuery);

...しかしもちろん、それは関数の作成を含みます。たぶんそれは問題ありません、プラグインが何をするかに依存します。

または、引数としてsettingsに渡します。complete

于 2011-04-26T08:24:28.480 に答える
2

settings内のスコープにはありませんcomplete()

于 2011-04-26T08:24:24.500 に答える
1

変数設定は、完全な機能の範囲外です。設定を定義した関数に完全な関数を配置します。

$.fn.MyjQueryPlugin = function(options) {
    var defaults = {
        onEnd: function(e) {}
    };

    function complete(e){
        settings.onEnd.call(this); // <- the error?
    }

    var settings = $.extend({}, defaults, options);

    return this.each(function() {
        // do stuff (complete() gets called here)

    });
};
于 2011-04-26T08:31:06.220 に答える