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 get请求提交跨域。 每个插件都将不同的数据提交给不同的URL,但整体逻辑是相同的。

你不应该为你的插件选项做$.extend() 。 插件基础结构应自动将调用者传入的选项与默认选项合并。 例如,给定此插件:

 $.widget( 'myPlugin', { options: { option1: undefined }, _create: function() { } } ); 

这个电话:

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

options.option1应该正确填充该函数。

我发现了我做错了什么。

我正在做的选择器测试总是返回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, ''); }); } 

现在所有三种类型(值,选择器或函数)都可以作为我的查询选项传入。