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, ''); }); }
现在所有三种类型(值,选择器或函数)都可以作为我的查询选项传入。