jquery插件,其中输入可以是选项,方法名称或带选项的方法名称

时间:2011-02-08 18:17:29

标签: jquery jquery-plugins

我有一个这样的插件。

(function ($) {
    var settings = {
        setting 1: undefined
    };

    var methods = {
        init: function (options) {
            var data = $(this).data('myPlugin');

            if (!data) {
                //initialize plugin

                $(this).data('myPlugin', {
                    setting1: settings.setting1
                });
            }
        },
        doSomething: function() {
            //...do some work
        }
        sendData: function(data) {
            //TODO: Post data to the server
        }
    };

    $.fn.myPlugin = function (options) {

        if (methods[options]) {
            return methods[options].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof options === 'object' || !options) {
            methods.init.apply(this, arguments);
            return methods.home.apply(this, arguments);
        } else {
            $.error('Method ' + options + ' does not exist in jQuery.myPlugin');
        }
    };

})(jQuery);

当我像这样使用它时,这很有效。

$('#myId').myPlugin({ setting1 : 'someValue' });

当我想做像

这样的事情
$('#myId').myPlugin('doSomething');

但是如何修改上面的代码来支持这个......

var myData = 'some data';
var moreData = 'some more data';
$('#myId').myPlugin('sendData', { data: myData, moreData: moreData } );

...在哪里我可以传递任何我想要的第二个参数并将该参数传递给函数?

1 个答案:

答案 0 :(得分:1)

这样的事情应该有效(在适当的地方好起来)

if( typeof options == "object" ) {
  // settings
} else {
  // action (better to explicitly check for string and undefined though)
  if( arguments.length > 1 ) {
     var action_options = arguments[1];
  }
}