2011-01-21 34 views
1

我有一個插件,我寫的接受選項。它看起來像這樣。jquery插件,多類型(值,控件ID,功能)選項

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

其中somevalue可以是值,控件ID或函數。

我有這樣

var settings = { 
    option1: null 
}; 

定義了默認設置,然後,我的插件裏面我用這個合併用戶與我的空設置傳入什麼對象

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

也能正常工作時,該選項是控件ID或值。

我的第一個問題是,當我使用這樣的函數

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

$.extend()似乎忽略在這種情況下的功能。從settings的默認值總是傳遞到我的解析器。當我傳入一個值而不是控件ID時,我也遇到了問題。我解析設置,以獲得類似這樣的

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

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

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

    return value; 
}; 

的值,如果我通過在日期或十進制,$('#' + value)計算結果爲true。

關於我如何使這項工作的任何想法?

編輯:

這可能是錯的,但我這是怎麼定義我的插件。它實際上是一組插件

(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獲取請求提交跨域。每個插件將不同的數據提交給不同的url,但總體邏輯是相同的。

回答

0

我發現我做錯了什麼。

我正在做的選擇器測試總是返回false,因爲如果沒有發現任何東西,jquery不會返回undefined。於是,我改變了我的分析器看起來像這樣:

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, ''); 
    }); 
} 

現在所有三種類型(值,選擇,或功能)可以被傳遞作爲我的查詢選項。

0

您不需要爲插件選項執行$.extend()。插件基礎結構應該自動合併調用者傳入的選項和默認選項。例如,假設這個插件:

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

     _create: function() { 
     } 
    } 
); 

而且這一呼籲:

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

options.option1應適當填充功能。

+0

我有我的插件完全不同的方式。也許他們的方式我建立它是錯誤的。 – Josh 2011-01-21 16:15:08