2011-01-21 9 views
1

私はオプションを受け入れるプラグインを持っています。このような感じです。 somevalueのいずれかの値、コントロールID、または機能とすることができるjqueryプラグイン、マルチタイプ(値、コントロールID、関数)のオプション

$('#myObject').myPlugin({ 
    option1: someValue 
}); 

私は私のプラグインの内側に、私は、ユーザーが自分の空の設定で渡すものをマージするためにこれを使用し、その後、この

var settings = { 
    option1: null 
}; 

のように定義されたデフォルト設定を持っている。これは、時に正常に動作します

if (options) { 
    $.extend(settings, options); 
} 

オブジェクトオプションはコントロールのIDまたは値です。

私はこの

$('#myObject').myPlugin({ 
    option1: function(){ return doStuff(); } 
}); 

$.extend()のような機能を使用するときに私の最初の問題はあるが、この場合の機能を無視しているようです。 settingsのデフォルト値は、常にパーサーに渡されます。私はまた、コントロールIDの代わりに値を渡すときに問題を抱えています。私は$('#' + value)は真と評価、私は日付や小数を渡す場合は、この

function parseValue(value, defaultValue) { 
    if ($.isFunction(value)) 
     return value(); 

    if (!value) 
     return defaultValue ? defaultValue : ''; 

    if ($('#' + value)) 
     return $('#' + value).val(); 

    return value; 
}; 

のような値を取得するには、設定を解析します。

どのように私はこの作品を作成する上でのアイデアですか?

EDIT:

これは間違っているかもしれないが、これは私が私のプラグインを定義した方法です。実際にはプラグインの集まりです

(function ($) { 

    //shared methods here 
    function parseValue(value, defaultValue) { /*...*/ } 

    $.fn.myplugin = function (options) { 
     var settings = { }; 

     $(this).live("submit", function (event) { 
      //NEVER EVER EVER allow the form to submit to the server 
      event.preventDefault(); 

      //logic for "posting" cross domain 
     }); 
    }; 

    $.fn.myplugin2 = function (options) { 
     var settings = { }; 

     $(this).live("submit", function (event) { 
      //NEVER EVER EVER allow the form to submit to the server 
      event.preventDefault(); 

      //logic for "posting" cross domain 
     }); 
    }; 

})(jQuery); 

プラグインはフォームをハイジャックし、jsonp get要求によってクロスドメインをサブミットします。各プラグインは異なるデータを別のURLに提出しますが、全体的なロジックは同じです。

答えて

0

私が間違っていたことがわかりました。

何も見つからなかった場合、jqueryはundefinedを返さないため、私が行っていたセレクターテストは常にfalseを返していました。だから、私はこのように私のパーサーを変更:

function parseValue(value, defaultValue) { 
    if ($.isFunction(value)) 
     return value(); 

    if (!value) 
     return defaultValue; 

    if ($.type(value) === 'string' && $(value).length) 
     return $(value).val(); 

    return value; 
}; 

と私のコードは、今、この

$.fn.myPlugin= function (options) { 

    var settings = { 
     setting1: undefined 
    } 

    $(this).live('click', function{ 
     var setting = parseValue(settings.setting1, ''); 
    }); 
} 

ようになり、現在はすべての3つのタイプ(値、セレクタ、または機能)に渡すことができます私のクエリオプションとして。

0

プラグインのオプションとして$.extend()を実行する必要はありません。プラグインインフラストラクチャは、呼び出し元によって渡されたオプションをデフォルトオプションと自動的にマージします。

$.widget(
    'myPlugin', 
    { 
     options: { 
      option1: undefined 
     }, 

     _create: function() { 
     } 
    } 
); 

そして、このコール:

foo.myPlugin({option1: function() { } }); 

options.option1が適切に機能して移入する必要がありますたとえば、このプラグインを与えられました。

+0

私は全く違った方法でプラグインを作りました。たぶん私はそれを構築する方法が間違っている。 – Josh

+0

ああ、どういうわけか私はあなたがjQueryウィジェットフレームワークを使用していなかったことを忘れていました。あなたはそれを使うことを検討すべきです。一般的な作業がずっと簡単になります。 – Jacob

+0

私はプラグインを宣言している方法で質問を更新しました。 – Josh

関連する問題